标签:
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<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdio>
using namespace std;
struct Point
{
int x;
int y;
int step;
Point (){}
Point(const Point& temp)
{
x=temp.x;
y=temp.y;
step=temp.step;
}
bool operator == (const Point& temp)const
{
return (x==temp.x)&&(y==temp.y);
}
};
Point start;
Point finish;
int dx[]={-2,-2,-1,-1,1,1,2,2};
int dy[]={1,-1,2,-2,2,-2,1,-1};
bool maze[10][10];
int bfs()
{
queue<Point> q;
start.step=0;
if(start==finish)
{
return start.step;
}
q.push(start);
maze[start.x][start.y]=1;
while(!q.empty())
{
Point temp=q.front();
q.pop();
for(int i=0;i<8;++i)
{
//cout<<(char)((int)temp.c+dx[i])<<" "<<temp.y+dy[i]<<endl;
if(temp.x+dx[i]<=8&&temp.x+dx[i]>=1&&temp.y+dy[i]<=8&&temp.y+dy[i]>=1&&!maze[temp.x+dx[i]][temp.y+dy[i]])
{
maze[temp.x+dx[i]][temp.y+dy[i]]=1;
Point t;
t.x=temp.x+dx[i];
t.y=temp.y+dy[i];
t.step=temp.step+1;
//cout<<t.c<<" "<<t.y<<" "<<t.step<<endl;
if(t==finish)
{
return t.step;
}
q.push(t);
}
}
}
return -1;
}
int main()
{
char a,b;
while(scanf(" %c%d %c%d",&a,&start.y,&b,&finish.y)!=EOF)
{
//cout<<start.c<<" "<<start.y<<" "<<finish.c<<" "<<finish.y<<endl;
start.x=a-'a'+1;
finish.x=b-'a'+1;
memset(maze,0,sizeof(maze));
int ans=bfs();
printf("To get from %c%d to %c%d takes %d knight moves.\n",a,start.y,b,finish.y,ans);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/leeholmes/article/details/51356935