题目大意:一个8*8的棋盘,行(1~8)列(a~h)
求从起点到终点的最小 马步 数
题目分析:简单的bfs,将字符转为数字,做坐标,8个方向
注意事项:行减‘1’不是‘0’,列减‘a';
开始时将队列清空
将访问数组清空
每句话后有一个点(.)
注意细节(因为把"a.t+1"打成了"a.x+1",找了一个多小时bug)
#include <cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char shi[5];//始点
char zhong[5]; //终点
int f; //最短路径
bool v[10][10]; //访问标记
int z[8][2]={ {2,1},{1,2}, {1,-2},{2,-1},{-1,2},{-2,1} ,{-1,-2},{-2,-1}} ; //8个坐标
struct node
{
int x;
int y;
int t;
};
queue <node> aa;
void bfs()
{
while(!aa.empty())
{
node a=aa.front();
aa.pop();
if(a.x==zhong[1]-'1'&&a.y==zhong[0]-'a')
{
f=a.t;
return;
}
for(int i=0;i<8;++i)
{
int nx=a.x+z[i][0];
int ny=a.y+z[i][1];
if(nx>=0&&ny>=0&&nx<8&&ny<8&&!v[nx][ny])
{
node q={nx,ny,a.t+1};
v[nx][ny]=1;
aa.push(q);
}
}
}
}
int main()
{
while(cin>>shi>>zhong)
{
while(!aa.empty())
aa.pop();
memset(v,0,sizeof(v));
node a={shi[1]-'1',shi[0]-'a',0};
aa.push(a);
v[shi[1]-'1'][shi[0]-'a']=1;
bfs();
cout<<"To get from "<<shi<<" to "<<zhong<<" takes "<<f<<" knight moves."<<endl;
}
return 0;
}