马走日字,bfs求最小步数
#include <iostream>
#include <queue>
#include<string.h>
using namespace std;
int s1,s2,e1,e2;
int tu[8][8];
int xx[8] = {1, 2, 1, 2, -1, -2, -1, -2};//x坐标变化
int yy[8] = {2, 1, -2, -1, 2, 1, -2, -1};//y坐标变化
int bfs()
{
memset(tu,0,sizeof(tu));//数组值全为0
queue<int> q;
int x1,y1,x2,y2;
tu[s1][s2]=0;//
q.push(s1);
q.push(s2);
while(!q.empty())
{
x1=q.front();
q.pop();
y1=q.front();
q.pop();
if(x1==e1&&y1==e2)//在原地不动
return tu[x1][y1];
for(int i=0; i<8; i++)
{
x2=x1+xx[i];
y2=y1+yy[i];
if(x2<0||x2>7||y2<0||y2>7||tu[x2][y2]>0)
continue;
tu[x2][y2]=tu[x1][y1]+1;
q.push(x2);
q.push(y2);
}
}
return 0;
}
int main()
{
char a[3],b[3];
int total;
while(cin>>a>>b)
{
s1=a[0]-'a';//输入的字母,是列,从第一列a开始,减去'a',转换
s2=a[1]-'1';//输入的数字,是行,从的第一行开始,减去'1',转换
e1=b[0]-'a';
e2=b[1]-'1';
total=bfs();
cout<<"To get from "<<a<<" to "<<b<<" takes "<<total<<" knight moves."<<endl;
}
return 0;
}