【洛谷 P1443】马的遍历 题解(广度优先搜索)

简介: 该问题是一个棋盘上的马的最短路径问题。给定一个$n\times m$的棋盘和起点$(x, y)$,需要计算马到达棋盘上每个位置的最短步数。输入包含$n, m, x, y$,输出是一个矩阵,表示各位置的步数或未可达的$-1$。使用广度优先搜索(BFS)策略,从起点开始遍历,直到访问完所有可达位置。代码中定义了太阳数组表示马的移动方向,并通过队列实现BFS。最后输出格式要求每个数字左对齐且域宽为5。

马的遍历

题目描述

有一个 $n \times m$ 的棋盘,在某个点 $(x, y)$ 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 $n, m, x, y$。

输出格式

一个 $n \times m$ 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 $-1$)。

样例 #1

样例输入 #1

3 3 1 1

样例输出 #1

0    3    2    
3    -1   1    
2    1    4

提示

数据规模与约定

对于全部的测试点,保证 $1 \leq x \leq n \leq 400$,$1 \leq y \leq m \leq 400$。

思路

  1. 马走“日”
  2. 输出格式:域宽为5,左对齐
  3. 注意判断是否越界

AC代码

#include <iostream>
#include <queue>
#include <cstring>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 405;
const int sun[8][2] = {
   -2, 1, -2, -1, -1, 2, -1, -2, 2, 1, 2, -1, 1, 2, 1, -2};
int n, m, x, y;

bool vis[maxn][maxn];
int stp[maxn][maxn];
queue<pair<int, int>> q;

void bfs(int x, int y)
{
   
    vis[x][y] = 1;
    stp[x][y] = 0;
    q.push(make_pair(x, y));
    while (!q.empty())
    {
   
        pair<int, int> f = q.front();
        q.pop();
        for (int i = 0; i < 8; i++)
        {
   
            int xx = f.first + sun[i][0];
            int yy = f.second + sun[i][1];
            if (xx > 0 && xx <= n && yy > 0 && yy <= m && !vis[xx][yy])
            {
   
                vis[xx][yy] = 1;
                q.push(make_pair(xx, yy));
                stp[xx][yy] = stp[f.first][f.second] + 1;
            }
        }
    }
}

int main()
{
   
    memset(vis, 0, sizeof(vis));
    memset(stp, -1, sizeof(stp));
    cin >> n >> m >> x >> y;
    stp[x][y] = 0;
    vis[x][y] = true;
    q.push(make_pair(x, y));
    bfs(x, y);
    for (int i = 1; i <= n; i++)
    {
   
        for (int j = 1; j <= m; j++)
        {
   
            printf("%-5d", stp[i][j]);
        }
        putchar('\n');
    }
    return 0;
}
目录
相关文章
|
2月前
|
存储 算法 数据可视化
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
|
3月前
|
算法
算法题解-反转链表
算法题解-反转链表
|
8月前
|
算法
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
洛谷P1443 马的遍历——广搜
洛谷P1443 马的遍历——广搜
59 0
洛谷(2947)向右看齐-单调栈-链表
单调栈对新手来说不好理解,但链表就特别简单,但在有时间限制的竞赛中,很容易超时,因此如果实在要使用链表,注意使用链表的类型,Java提供的两种实现链表的方式
从三道leetcode掌握广度优先搜索(BFS)
前言 BFS和DFS是如影随形的两种搜索方式,我们在上篇文章从三道leetcode掌握深度优先搜索(DFS)学习了递归的概念及DFS。不熟悉递归及DFS的同学可以先看看上篇文章,再阅读本篇比较好。
|
算法 Go Python
LeetCode46:全排列(八皇后)
LeetCode46:全排列(八皇后)
LeetCode46:全排列(八皇后)
|
算法 机器人 Python
DFS逛街算法模板-附剑指offer习题-LeetCode-深度优先搜索
DFS逛街算法模板-附剑指offer习题-LeetCode-深度优先搜索
DFS逛街算法模板-附剑指offer习题-LeetCode-深度优先搜索
|
算法 Java 索引
【算法题解】 Day26 双指针
今天的算法是 「双指针」 相关,“算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,以实战习题的形式理解算法,使用算法。”
78 0
|
算法 PHP
剑指Offer算法题解:58 - II. 左旋转字符串
剑指Offer算法题解:58 - II. 左旋转字符串
68 0