P1443 马的遍历
Posted fuxiqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1443 马的遍历相关的知识,希望对你有一定的参考价值。
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入样例#1: 复制
3 3 1 1
输出样例#1: 复制
0 3 2 3 -1 1 2 1 4
来源
洛谷:https://www.luogu.org/problemnew/show/P1443
分析
1.这道题是典型的搜索,个人认为BFS更好用,加上STL队列(queue 相关介绍点这里);
2.用一个布尔数组标记地图,每个点只能入队一次,且第一次入队的绝对是最短的;
3.用memset初始数组(棋盘);
上代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> //memset用到 4 #include<queue> //STL队列用到 5 using namespace std; 6 int nextt[8][2]= {{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}}; //方向 7 int s[500][500]; //定义棋盘 8 bool mark[500][500]; //标记棋子 9 struct node //用一个结构体存储当前所在的位置 10 { 11 int x,y,step; 12 }; 13 int n,m,sx,sy; 14 int i,j; 15 void bfs(int a,int b) 16 { 17 int k; 18 mark[a][b]=1; 19 s[a][b]=0; //起点设为0 20 queue<node>q; //定义队列 21 node q1; 22 q1.x=a; 23 q1.y=b; 24 q1.step=0; 25 q.push(q1); //起点坐标入队 26 while(!q.empty()) //搜索 27 { 28 node q2=q.front(); 29 for(k=0; k<=7; k++) 30 { 31 int xx=q2.x+nextt[k][0]; 32 int yy=q2.y+nextt[k][1]; 33 if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&(!mark[xx][yy]))//判断是否出界 34 { 35 node q3; 36 q3.x=xx; 37 q3.y=yy; 38 q3.step=(q2.step+1); 39 q.push(q3); 40 mark[xx][yy]=1; 41 s[xx][yy]=q3.step; 42 } 43 } 44 q.pop(); //重要一步 45 } 46 } 47 int main() 48 { 49 memset(s,-1,sizeof(s)); //棋盘初始化 50 scanf("%d%d%d%d",&n,&m,&sx,&sy); 51 bfs(sx,sy); 52 for(i=1; i<=n; i++) //输出 53 { 54 for(j=1; j<=m; j++) 55 { 56 printf("%-5d",s[i][j]); //注意输出格式 57 } 58 printf(" "); 59 } 60 return 0; 61 }
以上是关于P1443 马的遍历的主要内容,如果未能解决你的问题,请参考以下文章