#include<queue>
#include<iostream>
using namespace std;
struct Node
{
int x,y,pre;
};
struct offsets
{
int x,y;
};
offsets kmove[8];
int path(int rx,int ry,int m,int n)
{
int cboard[8][8]={0};
kmove[0].x=kmove[3].x=kmove[1].y=kmove[6].y=1;
kmove[1].x=kmove[2].x=kmove[0].y=kmove[7].y=2;
kmove[7].x=kmove[4].x=kmove[2].y=kmove[5].y=-1;
kmove[6].x=kmove[5].x=kmove[4].y=kmove[3].y=-2;//moving table
//int move[8][2] = {{-1,2},{-1,-2},{1,2},{1,-2},{2,-1},{2,1},{-2,-1},{-2,1}};
queue<Node> q;
Node temp1,temp2;
int x,y,loop;
temp1.x=rx;
temp1.y=ry;
temp1.pre=0;
cboard[rx][ry]=-1;
q.push(temp1);
while(!q.empty())
{
temp2=q.front();
q.pop();
for(loop=0;loop<8;loop++)
{
x=temp2.x+kmove[loop].x;
y=temp2.y+kmove[loop].y;
//p.x = x + move[i][0];
//p.y = y + move[i][1];
if(x<0||y<0||x>7||y>7)
continue;
if(cboard[x][y]==0)
{
temp1.x=x;
temp1.y=y;
cboard[x][y]=-1;
temp1.pre=temp2.pre+1;
q.push(temp1);
}
if((x==m)&&(y==n))
return temp1.pre;
}
}
return -1;
}
void main()
{
int h,y;
char s,c;
while(cin>>s>>h>>c>>y)
{
if(s==c&&h==y)
cout<<"To get from "<<s<<h<<" to "<<c<<y<<" takes 0 knight moves."<<endl;
else
cout<<"To get from "<<s<<h<<" to "<<c<<y<<" takes "<<path(s-'a',h-1,c-'a',y-1)<<" knight moves."<<endl;
cin.clear();
}
}
zoj1091-Knight Moves
最新推荐文章于 2019-11-11 19:59:17 发布