1、注意两点相同的情况,要加一个特判。
2、这题就是简单的bfs,但是我却WA了N次,就是因为没加特判,因为我的编译器bfs函数自动返回0(我以为这样就能实现特判了),OJ上的编译器bfs函数自动返回任意值,所以总是过不了。
3、一定要养成好的编码习惯,不要投机取巧,不要懒得思考特殊情况。
#include<cstdio>
#include<cstring>
using namespace std;
int q[100],vis[8][8],count[8][8];
int dir[8][2]={{2,1},{2,-1},{1,2},{1,-2},{-2,1},{-2,-1},{-1,2},{-1,-2}};
char s[7];
int a,b;
int bfs(int x,int y)
{
int front=0,rear=0,u,v,d,nx,ny;
u=x*8+y;
vis[x][y]=1;count[x][y]=0;
q[rear++]=u;
while(front<rear)
{
u=q[front++];
x=u/8;y=u%8;
for(d=0;d<8;d++)
{
nx=x+dir[d][0];ny=y+dir[d][1];
if(nx>=0&&nx<8&&ny>=0&&ny<8&&!vis[nx][ny])
{
v=nx*8+ny;
q[rear++]=v;
vis[nx][ny]=1;
count[nx][ny]=count[x][y]+1;
if(nx==a&&ny==b)
return count[nx][ny];
}
}
}
}
int main(void)
{
int x,y,ans;
while(fgets(s,7,stdin)!=NULL)
{
ans=0;
x=s[0]-'a';y=s[1]-'1';
a=s[3]-'a';b=s[4]-'1';
if(s[0]==s[3]&&s[1]==s[4])
{
printf("To get from %c%c to %c%c takes %d knight moves.\n",s[0],s[1],s[3],s[4],ans);
continue;
}
memset(q,0,sizeof(q));
memset(vis,0,sizeof(vis));
memset(count,0,sizeof(count));
ans=bfs(x,y);
printf("To get from %c%c to %c%c takes %d knight moves.\n",s[0],s[1],s[3],s[4],ans);
}
return 0;
}