【洛谷 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;
}
目录
相关文章
|
SQL Oracle 关系型数据库
|
存储 机器学习/深度学习 人工智能
【DSW Gallery】DSW基础使用介绍
PAI-DSW是一款云端机器学习开发IDE,为您提供交互式编程环境,适用于不同水平的开发者。本文为您介绍PAI-DSW的功能特点以及界面的基础使用。
【DSW Gallery】DSW基础使用介绍
|
C++
【洛谷 P1044】[NOIP2003 普及组] 栈 题解(递归+记忆化搜索)
**NOIP2003普及组栈问题**:给定操作数序列1到n,仅允许push(进栈)和pop(出栈)操作。目标是计算所有可能的输出序列总数。输入包含一个整数n(1≤n≤18)。示例输入3,输出5。当队列空时返回1,栈空则只能入栈,栈非空时可入栈或出栈。AC C++代码利用记忆化搜索求解。
196 1
|
8月前
|
计算机视觉
YOLOv11改进策略【卷积层】| CVPR-2024 利用DynamicConv 动态卷积 结合C3k2进行二次创新,提高精度
YOLOv11改进策略【卷积层】| CVPR-2024 利用DynamicConv 动态卷积 结合C3k2进行二次创新,提高精度
557 0
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
275 9
|
存储 消息中间件 算法
深入解析OpenStack Cinder:块存储服务详解
本文介绍了OpenStack及其块存储服务Cinder。OpenStack是一个开源云计算管理平台,提供基础设施即服务(IaaS),核心服务包括计算、网络、存储等。Cinder主要用于为虚拟机提供持久性块存储,具备多种功能,如卷操作、备份、快照及与实例的交互等。此外,还详细介绍了Cinder的工作流程、命令行操作及不同存储插件的使用。
1493 8
|
12月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
机器学习/深度学习 数据可视化 TensorFlow
基于tensorflow深度学习的猫狗分类识别
基于tensorflow深度学习的猫狗分类识别
573 1
|
Ubuntu 应用服务中间件 nginx
ubuntu编译安装nginx及安装nginx_upstream_check_module模块
以上是编译安装Nginx和安装 `nginx_upstream_check_module`模块的基本步骤。根据你的需求和环境,你可能需要进一步配置Nginx以满足特定的要求。
767 3
|
XML Docker 容器
Docker学习笔记十:docker Compose
Docker学习笔记十:docker Compose
237 1
Docker学习笔记十:docker Compose