马的遍历
题目描述:
有一个n×m 的棋盘,在某个点 (x, y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入
输入只有一行四个整数,分别为 n, m, x, y。
输出
一个n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出−1)。
样例输入
3 3 1 1
样例输出
0 3 2 3 -1 1 2 1 4
解决过程:
设置一个二维数组用来记录最小步数
再用一个队列来实现广度优先搜索(基操勿六):设置一个队列,不断从队首按入,从队尾弹出,也可以运用一个数组(tail&&head)
#include<bits/stdc++.h> int n,m,nx,ny; int res[405][405]; int x[8]={1,2,-1,-2,-1,-2,1,2}; int y[8]={2,1,2,1,-2,-1,-2,-1}; struct queee{ int x,y; }a[160010]; void bfs(int,int); int main() { scanf("%d%d%d%d",&n,&m,&nx,&ny); memset(res,-1,sizeof res); bfs(nx,ny); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%-5d",res[i][j]); printf("\n"); } return 0; } void bfs(int i,int j) { int head=1,tail=2; a[2].x=i,a[2].y=j; res[i][j]=0;//初始位置的最小步为0; while(head<tail) { head++; for(int q=0;q<8;q++) { //(xx,yy)表示目前马走到的位置。 int xx=a[head].x+x[q]; int yy=a[head].y+y[q]; if((res[xx][yy]==-1)&&(xx>=1)&&(xx<=n)&&(yy>=1)&&(yy<=m))//判断是否走过 { tail++; res[xx][yy]=res[a[head].x][a[head].y]+1;//最小步数加一 a[tail].x=xx; a[tail].y=yy; } } } }
但是我调试了好久,码学堂上的题始终没有AC
仍有一部分WA,不过WA是wonderful answer(确实)(自我安慰)(帅)
发布后的第二天,李思远说是队列开小了,我调试成160000然后发现果然通过了((^-^)V)