e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
To get from e2 to e4 takes 2 knight moves. To get from a1 to b2 takes 4 knight moves. To get from b2 to c3 takes 2 knight moves. To get from a1 to h8 takes 6 knight moves. To get from a1 to h7 takes 5 knight moves. To get from h8 to a1 takes 6 knight moves. To get from b1 to c3 takes 1 knight moves. To get from f6 to f6 takes 0 knight moves.
思路:就一个BFS。
#include <stdio.h>
struct {
int x,y,count;
}start,end,que[10000];
int n,bottom,top;
bool vis[9][9];
void search()
{
if(que[top].x==end.x && que[top].y==end.y) printf("%d knight moves.\n",que[top].count);
else
{
vis[que[top].x][que[top].y]=1;
if(que[top].x+1<=8 && que[top].y+2<=8 &&!vis[que[top].x+1][que[top].y+2])
{
que[bottom].x=que[top].x+1;
que[bottom].y=que[top].y+2;
que[bottom].count=que[top].count+1;
bottom++;
}
if(que[top].x+1<=8 && que[top].y-2>=1 &&!vis[que[top].x+1][que[top].y-2])
{
que[bottom].x=que[top].x+1;
que[bottom].y=que[top].y-2;
que[bottom].count=que[top].count+1;
bottom++;
}
if(que[top].x-1>=1 && que[top].y-2>=1 &&!vis[que[top].x-1][que[top].y-2])
{
que[bottom].x=que[top].x-1;
que[bottom].y=que[top].y-2;
que[bottom].count=que[top].count+1;
bottom++;
}
if(que[top].x-1>=1 && que[top].y+2<=8 &&!vis[que[top].x-1][que[top].y+2])
{
que[bottom].x=que[top].x-1;
que[bottom].y=que[top].y+2;
que[bottom].count=que[top].count+1;
bottom++;
}
if(que[top].x-2>=1 && que[top].y-1>=1 &&!vis[que[top].x-2][que[top].y-1])
{
que[bottom].x=que[top].x-2;
que[bottom].y=que[top].y-1;
que[bottom].count=que[top].count+1;
bottom++;
}
if(que[top].x-2>=1 && que[top].y+1<=8 &&!vis[que[top].x-2][que[top].y+1])
{
que[bottom].x=que[top].x-2;
que[bottom].y=que[top].y+1;
que[bottom].count=que[top].count+1;
bottom++;
}
if(que[top].x+2<=8 && que[top].y+1<=8 &&!vis[que[top].x+2][que[top].y+1])
{
que[bottom].x=que[top].x+2;
que[bottom].y=que[top].y+1;
que[bottom].count=que[top].count+1;
bottom++;
}
if(que[top].x+2<=8 && que[top].y-1>=1 &&!vis[que[top].x+2][que[top].y-1])
{
que[bottom].x=que[top].x+2;
que[bottom].y=que[top].y-1;
que[bottom].count=que[top].count+1;
bottom++;
}
top++;
search();
}
}
int main()
{
char temp[10];
int i,j;
while(gets(temp) && temp[0])
{
start.x=temp[0]-‘a‘+1;
start.y=temp[1]-‘0‘;
end.x=temp[3]-‘a‘+1;
end.y=temp[4]-‘0‘;
printf("To get from %c%c to %c%c takes ",temp[0],temp[1],temp[3],temp[4]);
for(i=1;i<=8;i++) for(j=1;j<=8;j++) vis[i][j]=0;
bottom=1;
top=0;
que[0].x=start.x;
que[0].y=start.y;
que[0].count=0;
search();
}
}
原文:http://blog.csdn.net/faithdmc/article/details/18826281