简单题意
给出初始位置,目标位置,问骑士(国际象棋骑士)走到(国际象棋走法)终点,至少要几步
解题思路形成过程
典型广度优先搜索,和老师讲的例题差不多不过这个题有一列设置成了字母,可以用ASCLL码转换成int,不过我自己写了个map映照来转换,之后用BFS来求目标
AC代码
#include<iostream>
#include<map>
#include<queue>
#include<string.h>
#include<fstream>
using namespace std;
struct point{
int x,y,cnt;
};
point start,finish;
int sy,ey;
bool v[9][9];
int dir[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
int bfs();
int main()
{
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
map<char,int>m;
for(int i=0;i<8;i++)m['a'+i]=i+1;//把字母转换为数字;
char c1,c2;
int min;
while(cin>>c1>>sy){
start.x=m[c1];
start.y=sy;
getchar();
cin>>c2>>ey;
finish.x=m[c2];
finish.y=ey;
if(start.x==finish.x&&start.y==finish.y)
min=0;
else min=bfs();
printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,sy,c2,ey,min);
}
return 0;
}
int bfs(){
memset(v,0,sizeof(v));
point pre,tmp;
start.cnt=0;
queue<point>q;
q.push(start);
v[start.x][start.y]=1;
while(!q.empty()){
pre=q.front();
q.pop();
if(pre.x==finish.x&&pre.y==finish.y)return pre.cnt;
for(int i=0;i<8;i++){
tmp.x=pre.x+dir[i][0];
tmp.y=pre.y+dir[i][1];
if(tmp.x<1||tmp.x>8||tmp.y<1||tmp.y>8)continue;
if(v[tmp.x][tmp.y]==1)continue;
v[tmp.x][tmp.y]=1;
tmp.cnt=pre.cnt+1;
q.push(tmp);
}
}
return -1;
}