这是我的杭电100题,骑士遍历。。。。
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<cstring>
using namespace std;
int vis[100][100],stx,sty,dex,dey,q[1000000],cnt;
int dis[100][100];
int direction[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{-1,2},{1,2},{2,1}};
void bfs(int x,int y)
{
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
int front=0,rear=0,dx,dy,vx,vy;
int u=x*8+y,v;
q[rear++]=u;
vis[x][y]=1;
while(front<rear)
{
v=q[front++];
vx=v/8,vy=v%8;
if(vx<0||vy<0||vx>=8||vy>=8) continue;
for(int i=0;i<8;i++)
{
dx=vx+direction[i][0];
dy=vy+direction[i][1];
if(dx>=0&&dy>=0&&dx<8&&dy<8&&!vis[dx][dy])
{
vis[dx][dy]=1;
q[rear++]=dx*8+dy;
dis[dx][dy]=dis[vx][vy]+1;
if(dx==dex&&dy==dey) break;
}
}
}
}
int main()
{
//ifstream cin("a.txt");
string s1,s2;
while(cin>>s1>>s2)
{
char x1,y1,x2,y2;
istringstream ss1(s1);
istringstream ss2(s2);
ss1>>x1>>y1;ss2>>x2>>y2;
stx=x1-'a';sty=y1-'0'-1;
dex=x2-'a';dey=y2-'0'-1;
cnt=0;
bfs(stx,sty);
cout<<"To get from "<<s1<<" to "<<s2<<" takes "<<dis[dex][dey]<<" knight moves.\n";
}
return 0;
}