Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3001 Accepted Submission(s): 1868
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.
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.
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int tx[]={1,-1,2,-2,1,-1,2,-2};
const int ty[]={2,2,1,1,-2,-2,-1,-1};
class A
{
public:
int x,y,step;
};
A map[100000];
bool vis[15][15];
int x_start,y_start,x_end,y_end;
int ans;
int bfs()
{
if(x_start==x_end&&y_start==y_end)
return 0;
ans=0;
int front=0,rear=1;
int dx,dy;
dx=x_start;
dy=y_start;
map[0].x=x_start;
map[0].y=y_start;
map[0].step=1;
vis[dx][dy]=1;
while(front<rear)
{
for(int i=0;i<8;i++)
{
dx=map[front].x+tx[i];
dy=map[front].y+ty[i];
if(dx>8||dx<1||dy>8||dy<1||vis[dx][dy])
continue;
if(dx==x_end&&dy==y_end)
return map[front].step;
map[rear].x=dx;map[rear].y=dy;
map[rear].step=map[front].step+1;
rear++;
}
front++;
}
return 0;
}
int main()
{
//freopen("4.txt","r",stdin);
char start,end;
while(scanf("%c%d %c%d",&start,&y_start,&end,&y_end)!=EOF)
{
getchar();
x_start=start-'a'+1;
x_end=end-'a'+1;
memset(vis,0,sizeof(vis));
int z=bfs();
printf("To get from %c%d to %c%d takes %d knight moves.\n",start,y_start,end,y_end,z);
}
}
172



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



