国际象棋标准棋盘,给出马的起点位置和终点位置,求最小移动步数。
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int bz[8][8];
int main()
{
int tx[8]={1,2,2,1,-1,-1,-2,-2};
int ty[8]={2,1,-1,-2,2,-2,1,-1};
while(1)
{
memset(bz,0,sizeof(bz));
string t;
cin>>t;
if(cin.eof()==1)
{
break;
}
int ax,ay;
ax=t[0]-'a';
ay=t[1]-'0'-1;
string v;
cin>>v;
int bx,by;
bx=v[0]-'a';
by=v[1]-'0'-1;
queue<int> qx;
queue<int> qy;
queue<int> qd;
int d=0;
qx.push(ax);
qy.push(ay);
qd.push(d);
while(qx.empty()!=1)
{
int x,y;
x=qx.front();
y=qy.front();
d=qd.front();
qx.pop();
qy.pop();
qd.pop();
if((x==bx)&&(y==by))
{
break;
}
d++;
if(bz[x][y]==0)
{
bz[x][y]=d;
}else
{
continue;
}
for(int i=0;i<8;i++)
{
int cx=x+tx[i];
int cy=y+ty[i];
if((cx>=0)&&(cx<8)&&(cy>=0)&&(cy<8))
{
qx.push(cx);
qy.push(cy);
qd.push(d);
}
}
}
cout<<"To get from "<<t<<" to "<<v<<" takes "<<d<<" knight moves."<<endl;
}
}