【洛谷 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;
}
目录
相关文章
|
6月前
【洛谷 P2089】烤鸡(深度优先搜索)
## 摘要: 猪猪Hanke的烤鸡问题要求找出所有配料组合,使得$10$种配料(每种$1$到$3$克)的总和等于给定美味程度$n$。输入为正整数$n$,输出为方案总数及所有符合条件的配料分配,按字典序排列。样例输入$11$,输出$10$种方案。代码采用递归搜索,先计数再打印方案。$n\leq5000$时保证数据覆盖。
33 0
|
6月前
|
存储 算法 数据可视化
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
|
7月前
|
算法
算法题解-反转链表
算法题解-反转链表
|
7月前
|
机器学习/深度学习 算法
【动态规划刷题 17】回文子串&& 最长回文子串
【动态规划刷题 17】回文子串&& 最长回文子串
|
7月前
|
存储 算法
六六力扣刷题双指针之链表相交
六六力扣刷题双指针之链表相交
57 0
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
蓝桥杯AcWing 题目题解 - 递归与递推
蓝桥杯AcWing 题目题解 - 递归与递推
每日一题——四数之和(双指针解法)
每日一题——四数之和(双指针解法)
洛谷P1443 马的遍历——广搜
洛谷P1443 马的遍历——广搜
78 0
|
算法 vr&ar C++
【AcWing】双指针算法
这一篇博客也用了双指针算法,同学们可以参考一下
106 0