/*骑士问题*/
#include <iostream>
#include <string>
//#include <fstream>
#include <queue>
using namespace std;
#define MAX 12
typedef struct _point
{
int x;
int y;
int dep;
}point;
int map[MAX][MAX];
int p[][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
point start,end;
//fstream fin;
int bfs();
int main()
{
//fin.open("2585.txt",ios::in);
int times=0;
int b;
while(cin>>b)
{
if(b==-1) break;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
map[i][j]=1;
//周围围上栅栏
for(int i=2;i<10;i++)
for(int j=2;j<10;j++)
map[i][j]=0;
string a;
for(int i=0;i<b;i++)
{
cin>>a;
map[a[0]-'a'+2][(a[1]-'1')+2]=1;
}
cin>>a;
start.x=a[0]-'a'+2;
start.y=a[1]-'1'+2;
start.dep=0;
cin>>a;
end.x=a[0]-'a'+2;
end.y=a[1]-'1'+2;
int dep=bfs();
if(dep)
cout<<"Board "<<++times<<":"<<dep<<" moves"<<endl;
else
cout<<"Board "<<++times<<":not reachable"<<endl;
}
system("pause");
return 0;
}
int bfs()
{
int dep=0;
queue<point> Q;
Q.push(start);
while(!Q.empty())
{
//当前是的dep
for(int i=0;i<8;i++)
{
point cur=Q.front();
if(map[cur.x+p[i][0]][cur.y+p[i][1]]==0)
{
if(end.x==cur.x+p[i][0]&&cur.y+p[i][1]==end.y)
{
end.dep=cur.dep+1;
return end.dep;
}
map[cur.x+p[i][0]][cur.y+p[i][1]]=1;
point temp;
temp.x=cur.x+p[i][0];
temp.y=cur.y+p[i][1];
temp.dep=cur.dep+1;
Q.push(temp);
}
}
Q.pop();
}
return 0;
}
骑士问题
最新推荐文章于 2020-07-17 17:33:21 发布