题意
给出一个8*8的棋盘,上面有一些障碍物,我们知道骑士是走L形的,现在给出骑士的坐标和终点坐标,求出骑士能到达的最少步数,如果不能到达就输出not reachable。
思路
就是一个简单的BFS模板题,注意细节就好了。
代码
#include<cstdio>
#include<cstring>
using namespace std;
int ans,head,tail,n,a,b,xp1,yp1,xp2,yp2,x,y,state[10001][2],father[10001],cnt;//0x,1y;
bool map[9][9];
char c[2];
short dx[8]={1,2,2,1,-1,-2,-2,-1},dy[8]={2,1,-1,-2,2,1,-1,-2};
bool check()
{
for (int i=1;i<=head;i++)
if (state[tail][1]==state[i][1]&&state[tail][0]==state[i][0]) return 0;
return 1;
}
void Ans(int x)
{
while (father[x]!=0)
{
ans++;
x=father[x];
}
}
void bfs()
{
if (xp1==xp2&&yp1==yp2) return;
state[1][0]=xp1;state[1][1]=yp1;
head=0;tail=1;
do
{
head++;
for (int i=0;i<8;i++)
{
x=state[head][0]+dx[i];y=state[head][1]+dy[i];
if (x>8||x<1||y>8||y<1||map[x][y]) continue;
state[++tail][0]=x;state[tail][1]=y;
if (!check()) {tail--;continue;}
father[tail]=head;
if (state[tail][0]==xp2&&state[tail][1]==yp2) {Ans(tail);return;}
}
}
while (head<tail);
ans=-1;
}
int main()
{
while (scanf("%d",&n),n!=-1)
{
ans=0;
memset(map,0,sizeof(map));
for (int i=1;i<=n;i++)
{
scanf("%s",c);
a=c[0]-96;b=c[1]-48;
map[a][b]=1;
}
scanf("%s",c);
xp1=c[0]-96;yp1=c[1]-48;
scanf("%s",c);
xp2=c[0]-96;yp2=c[1]-48;
bfs();
if (ans!=-1) printf("Board %d: %d moves\n",++cnt,ans);
else printf("Board %d: not reachable\n",++cnt);
}
}