#1074 骑士问题 的题解
题目描述
小明是一名出色的棋手,声称没有人能像他那样快速地把骑士从一个位置移到另一个位置,你能打败他吗?
编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。
编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。
输入
第一行给出骑士的数量 n。对于每一个骑士都有3行,第一行一个整数 L 表示棋盘的大小(4≤L≤300),整个棋盘大小为 L×L;
第二行和第三行分别包含一对整数 (x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。
第二行和第三行分别包含一对整数 (x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。
输出
对每一个骑士输出一行,一个整数表示需要移动的最小步数。如果起始点和终点相同,则输出 0。
-
样例输入
View Code
-
样例输出
View Code
题解
-
分析
这道题是一道广搜题,用深搜可能会时间超限。这道题难度也不低,代码很长,需要用到队列queue
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 bool vis[301][301]; 4 int step[301][301],ans,t,n,sx,sy,ex,ey,nx,ny; 5 int main() 6 { 7 scanf("%d",&t); 8 while(t--) 9 { 10 scanf("%d%d%d%d%d",&n,&sx,&sy,&ex,&ey); 11 queue<int> qx,qy; 12 qx.push(sx),qy.push(sy); 13 vis[sx][sy]=1; 14 step[sx][sy]=0; 15 while(!qx.empty()&&!qy.empty()) 16 { 17 nx=qx.front(),qx.pop(); 18 ny=qy.front(),qy.pop(); 19 if(nx==ex&&ny==ey) 20 { 21 ans=step[ex][ey]; 22 break; 23 } 24 if(nx-2>=0&&ny+1<=n&&vis[nx-2][ny+1]==0)//八个方向开始搜索 25 { 26 qx.push(nx-2); 27 qy.push(ny+1); 28 step[nx-2][ny+1]=step[nx][ny]+1; 29 vis[nx-2][ny+1]=1; 30 } 31 if(nx-2>=0&&ny-1>=0&&vis[nx-2][ny-1]==0) 32 { 33 qx.push(nx-2); 34 qy.push(ny-1); 35 step[nx-2][ny-1]=step[nx][ny]+1; 36 vis[nx-2][ny-1]=1; 37 } 38 if(nx-1>=0&&ny+2<=n&&vis[nx-1][ny+2]==0) 39 { 40 qx.push(nx-1); 41 qy.push(ny+2); 42 step[nx-1][ny+2]=step[nx][ny]+1; 43 vis[nx-1][ny+2]=1; 44 } 45 if(nx-1>=0&&ny-2>=0&&vis[nx-1][ny-2]==0) 46 { 47 qx.push(nx-1); 48 qy.push(ny-2); 49 step[nx-1][ny-2]=step[nx][ny]+1; 50 vis[nx-1][ny-2]=1; 51 } 52 if(nx+1<=n&&ny+2<=n&&vis[nx+1][ny+2]==0) 53 { 54 qx.push(nx+1); 55 qy.push(ny+2); 56 step[nx+1][ny+2]=step[nx][ny]+1; 57 vis[nx+1][ny+2]=1; 58 } 59 if(nx+2<=n&&ny+1<=n&&vis[nx+2][ny+1]==0) 60 { 61 qx.push(nx+2); 62 qy.push(ny+1); 63 step[nx+2][ny+1]=step[nx][ny]+1; 64 vis[nx+2][ny+1]=1; 65 } 66 if(nx+2<=n&&ny-1>=0&&vis[nx+2][ny-1]==0) 67 { 68 qx.push(nx+2); 69 qy.push(ny-1); 70 step[nx+2][ny-1]=step[nx][ny]+1; 71 vis[nx+2][ny-1]=1; 72 } 73 if(nx+1<=n&&ny-2>=0&&vis[nx+1][ny-2]==0) 74 { 75 qx.push(nx+1); 76 qy.push(ny-2); 77 step[nx+1][ny-2]=step[nx][ny]+1; 78 vis[nx+1][ny-2]=1; 79 } 80 } 81 printf("%d\n",ans); 82 memset(vis,0,sizeof(vis)); 83 memset(step,0,sizeof(step)); 84 nx=0,ny=0,ans=0; 85 while(!qx.empty()&&!qy.empty()) 86 { 87 qx.pop(); 88 qy.pop(); 89 } 90 } 91 return 0; 92 }