#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef struct Point
{
int x, y;
}POINT;
queue <POINT> me;
POINT Begin , End;
bool visited[9][9];
bool flag;
int ans;
int movei[8]= {2,-2,1,-1,2,-2,1,-1};
int movej[8]= {1,-1,2,-2,-1,1,-2,2};
void init()
{
int i, j;
for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
visited[i][j] = false;
}
bool isok(POINT *p)
{
if(p->x == End.x && p->y == End.y)
return true;
else
return false;
}
bool isin(POINT *pt)
{
if(pt->x >= 1 && pt->x <= 8)
if(pt->y >= 1 && pt->y <= 8)
return true;
return false;
}
void change(char *str, POINT *pt)
{
pt->x = str[0] - 'a' +1;
pt->y =str[1] - '0';
}
void bfs()
{
int i, q, casenum;
POINT pt, tp;
casenum = 1;
while(!me.empty())
{
ans++;
q = 0;
while(casenum--)
{
pt = me.front();
me.pop();
for( i = 0; i < 8; i++)
{
tp.x = pt.x + movei[i];
tp.y = pt.y + movej[i];
if(isin(&tp))
{
if(visited[tp.x][tp.y])
continue;
else
{
if(isok(&tp))
{
flag = true;
return;
}
else
{
visited[tp.x][tp.y] = true;
me.push(tp);
q++;
}
}
}
}
}
casenum = q;
}
if(me.empty())
flag = false;
return ;
}
int main()
{
int n, i, casenum;
POINT tp;
char str[10];
casenum = 1;
while(true)
{
while(!me.empty())
me.pop();
flag = true;
ans = 0;
init();
scanf("%d", &n);
if(-1 == n)
break;
for(i = 0; i < n; i++)
{
scanf("%s", str);
change(str, &tp);
visited[tp.x][tp.y] = true;
}
scanf("%s", str);
change(str, &Begin);
scanf("%s", str);
change(str, &End);
me.push(Begin);
visited[Begin.x][Begin.y] = true;
if(isok(&Begin))
printf("Board %d: %d moves\n", casenum, ans);
bfs();
if(flag)
printf("Board %d: %d moves\n", casenum, ans);
else
printf("Board %d: not reachable\n", casenum);
casenum++;
}
return 0;
}
题目链接