#1074 骑士问题 的题解

题目描述

小明是一名出色的棋手,声称没有人能像他那样快速地把骑士从一个位置移到另一个位置,你能打败他吗?
编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。

输入

第一行给出骑士的数量 n。对于每一个骑士都有3行,第一行一个整数 L 表示棋盘的大小(4≤L≤300),整个棋盘大小为 L×L;
第二行和第三行分别包含一对整数 (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 }
View Code

 

posted @ 2019-07-26 12:43  SSFLRK  阅读(577)  评论(0编辑  收藏  举报