| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9346 | Accepted: 5342 |
Description
Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.
Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
Input
Output
Sample Input
e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
Sample Output
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就可以过得题,练习下双向BFS
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct Node{
int x,y;
int cent;
};
Node queue[2][100];
int hash[2][10][10];
int BFS(Node &star,Node &end)
{
int base[2],top[2];
int flag=0,i,j,k,tmp;
int cc[8][2]={1,2, 1,-2, -1,2, -1,-2, 2,1, 2,-1, -2,1, -2,-1};
if(star.x==end.x && star.y==end.y)
return 0;
star.cent=0; end.cent=0;
base[0]=base[1]=top[0]=top[1]=0;
queue[0][0]=star;
queue[1][0]=end;
memset(hash,-1,sizeof(hash));;
hash[0][star.x][star.y]=0; hash[1][end.x][end.y]=0;
while(base[flag]<=top[flag] || base[tmp]<=top[tmp])
{
tmp=(flag+1)%2;
if(base[flag]>top[flag])
{
flag=tmp;
continue;
}
for(i=0;i<8;i++)
{
int tmp_x=queue[flag][base[flag]].x+cc[i][0];
int tmp_y=queue[flag][base[flag]].y+cc[i][1];
if(tmp_x>0 && tmp_x<=8 && tmp_y>0 && tmp_y<=8 && hash[flag][tmp_x][tmp_y]==-1)
{
if(hash[tmp][tmp_x][tmp_y]!=-1)
return queue[flag][base[flag]].cent+hash[tmp][tmp_x][tmp_y]+1;
queue[flag][++top[flag]].x=tmp_x;
queue[flag][top[flag]].y=tmp_y;
queue[flag][top[flag]].cent=queue[flag][base[flag]].cent+1;
hash[flag][tmp_x][tmp_y]=queue[flag][top[flag]].cent;
}
}
base[flag]++;
flag=tmp;
}
}
int main()
{
int A,B;
char a,b;
Node star,end;
while(scanf("%c%d %c%d",&a,&A,&b,&B)==4)
{
star.x=a-'a'+1; star.y=A;
end.x=b-'a'+1; end.y=B;
printf("To get from %c%d to %c%d takes %d knight moves.\n",a,A,b,B,BFS(star,end));
getchar();
}
return 0;
}
377



被折叠的 条评论
为什么被折叠?



