【洛谷 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月前
|
人工智能 供应链 搜索推荐
我是一家电商企业,推荐一款Agent产品:从选型到落地的全攻略
双11后客服积压、发货出错、营销低效?传统电商遭遇人力与效率瓶颈。智能Agent成破局关键:0.3秒响应、错误率降至0.2%、转化率翻倍。实在Agent依托TARS大模型,覆盖客服、订单、营销全链路,降本增效显著,助力中小及大型电商实现数字化转型。选对Agent,才是赢在存量时代的开始。(239字)
419 0
|
机器学习/深度学习 算法 C++
【洛谷 P2240】【深基12.例1】部分背包问题 题解(贪心算法)
**深基12.例1**是部分背包问题,$N$堆金币,每堆$(m_i, v_i)$,$T$承重限制。按金币单价降序装包,保证价值最大化。输入$N,T$及每堆金币详情,输出两位小数的最大价值。示例:输入$4,50$,输出$240.00$。AC代码使用C++,通过排序和迭代实现。
356 0
【洛谷 P1036】[NOIP2002 普及组] 选数 题解(深度优先搜索+判断质数+枚举子集)
**NOIP2002普及组选数问题**:给定$n$个整数和一个整数$k$,需找出所有$k$个数的组合,计算它们的和为素数的种类数。输入包含$n$和$k$,以及$n$个整数;输出是符合条件的组合数。例如,对于输入`4 3`和数组`[3, 7, 12, 19]`,输出为`1`。代码使用递归枚举子集并检查质数的方法。
526 0
|
C++
【洛谷 P1044】[NOIP2003 普及组] 栈 题解(递归+记忆化搜索)
**NOIP2003普及组栈问题**:给定操作数序列1到n,仅允许push(进栈)和pop(出栈)操作。目标是计算所有可能的输出序列总数。输入包含一个整数n(1≤n≤18)。示例输入3,输出5。当队列空时返回1,栈空则只能入栈,栈非空时可入栈或出栈。AC C++代码利用记忆化搜索求解。
314 1
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
421 9
|
存储 消息中间件 算法
深入解析OpenStack Cinder:块存储服务详解
本文介绍了OpenStack及其块存储服务Cinder。OpenStack是一个开源云计算管理平台,提供基础设施即服务(IaaS),核心服务包括计算、网络、存储等。Cinder主要用于为虚拟机提供持久性块存储,具备多种功能,如卷操作、备份、快照及与实例的交互等。此外,还详细介绍了Cinder的工作流程、命令行操作及不同存储插件的使用。
1962 8
|
SQL BI HIVE
【Hive SQL 每日一题】统计用户留存率
用户留存率是衡量产品成功的关键指标,表示用户在特定时间内持续使用产品的比例。计算公式为留存用户数除以初始用户数。例如,游戏发行后第一天有10000玩家,第七天剩5000人,第一周留存率为50%。提供的SQL代码展示了如何根据用户活动数据统计每天的留存率。需求包括计算系统上线后的每日留存率,以及从第一天开始的累计N日留存率。通过窗口函数`LAG`和`COUNT(DISTINCT user_id)`,可以有效地分析用户留存趋势。
1661 1
|
机器学习/深度学习 数据可视化 TensorFlow
基于tensorflow深度学习的猫狗分类识别
基于tensorflow深度学习的猫狗分类识别
805 1
|
人工智能 安全 小程序
AI智慧校园电子班牌云平台源码
家长端 多场景通话:上学放学联系、紧急遇险求助联系、日常亲情通话关注孩子人身安全:到校离校情况、进入危险区域预警等 学校端 课堂秩序管理:提高教学质量,答题测试系统,上课时设备禁用校外危险事件预警:设置校方围栏,管理危险区域,防止溺水等事件学生定位查询:尤其寄宿学校,需要了解学生位置信息、历史轨迹校园日常场景:考勤打卡、校内食堂消费、体温监测。
296 0
|
开发工具 C语言 数据安全/隐私保护
git提交代码到远端仓库的方法详解
git提交代码到远端仓库的方法详解
306 0