入门bfs搜索题,题意为给点起点终点问最少多少步到达,使用双向bfs,比盲搜时间
快了将近一倍
#include <cstdio>
#include <queue>
using namespace std;
const int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
struct node{
int x,y;
};
typedef pair <node,int> pii;
bool in(int x,int y){
if(x<=8&&x>0&&y<=8&&y>0)
return true;
return false;
}
int main()
{
char A[5],B[5];
while(scanf("%s%s",A,B)!=EOF){
int qp[9][9];
for(int i=1;i<=8;i++)
for(int j=0;j<=8;j++)
qp[i][j]=0;
node Begin={A[0]-96,A[1]-48};
node End={B[0]-96,B[1]-48};
if(Begin.x==End.x&&Begin.y==End.y){
printf("To get from %s to %s takes 0 knight moves.\n",A,B);
continue;
}
qp[Begin.x][Begin.y]=1;
qp[End.x][End.y]=2;
queue<pii> q;
queue<pii> p;
q.push(make_pair(Begin,0));
p.push(make_pair(End,0));
int flag=1;
int ans1=0,ans2=0;
while(flag){
int cnt1=q.size();
while(cnt1--&&!q.empty()&&flag){
pii pi=q.front();
q.pop();
int nowx=pi.first.x;
int nowy=pi.first.y;
ans1=pi.second+1;
for(int i=0;i<8;i++){
if(in(nowx+dir[i][0],nowy+dir[i][1])){
if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==0){
node lin={nowx+dir[i][0],nowy+dir[i][1]};
q.push(make_pair(lin,ans1));
qp[lin.x][lin.y]=1;
}
else if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==2){
printf("To get from %s to %s takes %d knight moves.\n",A,B,ans1+ans2);
flag=0;
break;
}
}
}
}
int cnt2=p.size();
while(cnt2--&&!p.empty()&&flag){
pii pi=p.front();
p.pop();
int nowx=pi.first.x;
int nowy=pi.first.y;
ans2=pi.second+1;
for(int i=0;i<8;i++){
if(in(nowx+dir[i][0],nowy+dir[i][1])){
if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==0){
node lin={nowx+dir[i][0],nowy+dir[i][1]};
p.push(make_pair(lin,ans1));
qp[lin.x][lin.y]=2;
}
else if(qp[nowx+dir[i][0]][nowy+dir[i][1]]==1){
printf("To get from %s to %s takes %d knight moves.\n",A,B,ans1+ans2);
flag=0;
break;
}
}
}
}
}
}
return 0;
}