首页 > 其他 > 详细

P1443 马的遍历

时间:2020-05-15 12:17:20      阅读:49      评论:0      收藏:0      [点我收藏+]

首先我们来看题:

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

这里要注意,马是怎么走的,会中国象棋的同学应该知道马走日,象走田的规则。

求最短距离的题,一般就是广搜。

思路也没有什么好讲的......

具体看代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct Node{
    int x;// 马的x坐标 
    int y;// 马的y坐标 
    int sum;//记录步数 
}que[101000];//数组模拟队列,由于本人不是很喜欢STL的队列,所以就用数组模拟了 
long long n,m,mx,my;//棋盘大小,和初始马的坐标 
long long dx[8]={-2,-2,-1,-1,1,1,2,2};//马可以走到的8个方向 
long long dy[8]={1,-1,2,-2,2,-2,1,-1};//不知道马怎么走的同学可以去百度,记住马走日就好了 
long long ans[501][501];//记录答案的数组 
long long book[501][501];//记录重复的数组 
void bfs(int n,int m,int mx,int my){
    int head=1,tail=2;//头和尾 
    que[1].x=mx;//马的初始坐标 
    que[1].y=my;//马的初始坐标 
    ans[mx][my]=0;//马所在的位置所用的步数为零 
    book[mx][my]=1;//标记 
    while(head<tail){
        for(int i=0;i<8;i++){//搜索8个点 
            int idx=que[head].x+dx[i];//计算马所在的位置 
            int idy=que[head].y+dy[i];//同理 
            if(idx>0&&idx<=n&&idy>0&&idy<=m&&book[idx][idy]==0){//判断是否越界,是否来过 
                book[idx][idy]=1;//标记为来过 
                que[tail].x=idx;//更新马的x坐标 
                que[tail].y=idy;//更新马的y坐标  
                que[tail].sum=que[head].sum+1;//更新步数 
                ans[idx][idy]=que[tail].sum;//记录步数 
                tail++;//尾++,这里相当于出栈 
            }
        }
        head++;//头++,这里相当于入栈 
    }
}
int main(){
    scanf("%lld%lld%lld%lld",&n,&m,&mx,&my);//输入 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            ans[i][j]=-1;//让答案的初始值为-1 
        }
    }
    bfs(n,m,mx,my);//搜索 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            printf("%-5lld",ans[i][j]);//输出,左对齐,宽5格 
        }
        printf("\n");
    }
    return 0;//完美结束 
}

 

P1443 马的遍历

原文:https://www.cnblogs.com/shanxx/p/12893818.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!