P1443 马的遍历

文章讲述了如何使用BFS算法计算马从给定起点在棋盘上到达任意点的最短路径,涉及输入输出示例和C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1

3 3 1 1

输出 #1

0    3    2    
3    -1   1    
2    1    4    

说明/提示

数据规模与约定

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

题目难度

普及-

参考思路

马有八个方向,存数组比if——if——if——if...好得多(见代码mx[ ],my[ ])

还有要注意n行m列,给的出发坐标先给的行!

再注意越界判断要在访问数组之前

PS:用到了iomanip头文件中的setw()

参考代码

 #include<bits/stdc++.h>
using namespace std;
int b,e=2,a[410][410],pro[410*410][2],mx[8]={2,-2,2,-2,-1,1,-1,1},my[8]={1,1,-1,-1,2,2,-2,-2},n,m,x,y;
int main()
{
    cin>>n>>m>>x>>y;
    memset(a,0xff,sizeof(a));//初始值:-1 
    pro[1][0]=x,pro[1][1]=y,a[x][y]=0;
    while(b++<e-1)//头端加1并判断 
    for(int i=0;i<8;i++)
    {
        int xx=pro[b][0]+mx[i],yy=pro[b][1]+my[i];//先求坐标判断后再用数组访问 
        if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[xx][yy]==-1)
        pro[e][0]=xx,pro[e++][1]=yy,a[xx][yy]=a[pro[b][0]][pro[b][1]]+1;//添加到bfs数组尾端 
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        cout<<left<<setw(5)<<a[i][j];//控制行距 
        cout<<endl;
    }    
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值