BFS的题,没有用BFS做,而是用的Floyd做的
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int inf=1<<28;
int map[9][9][9][9],movex[8]={1,1,-1,-1,2,2,-2,-2},movey[8]={2,-2,2,-2,1,-1,1,-1};
void Init()
{
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
for(int k=1;k<=8;k++)
for(int l=1;l<=8;l++)
{
if(i==k&&j==l)
map[i][j][k][l]=0;
else
map[i][j][k][l]=inf;
}
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
for(int k=0;k<8;k++)
{
int itx=i+movex[k];
int ity=j+movey[k];
if(itx<0||itx>8||ity<0||ity>8)
continue;
map[i][j][itx][ity]=1;
}
for(int kx=1;kx<=8;kx++)
for(int ky=1;ky<=8;ky++)
for(int ix=1;ix<=8;ix++)
for(int iy=1;iy<=8;iy++)
for(int jx=1;jx<=8;jx++)
for(int jy=1;jy<=8;jy++)
map[ix][iy][jx][jy]=min(map[ix][iy][kx][ky]+map[kx][ky][jx][jy],map[ix][iy][jx][jy]);
}
int main()
{
char stra[3],strb[3];
Init();
while(scanf("%s%s",stra,strb)!=EOF)
{
printf("To get from %s to %s takes %d knight moves.\n",stra,strb,map[stra[0]-'a'+1][stra[1]-'0'][strb[0]-'a'+1][strb[1]-'0']);
}
return 0;
}