使用队列保存未被检测的节点 节点按照深度优先的次序被访问 并依次压入队列中 并以相反的次序进行出队列
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct point{
int x,y,step;
};
int bfs(point s,point e,int map[9][9]){
queue<point> tp;
point t;//临时变量
//s->之前
//e->目标
s.step = 0; //计数
map[s.x][s.y] = 1; //走过就标记为1
tp.push(s); //初始化队列
while(!tp.empty()){
s=tp.front();//队首
tp.pop();//delete
if(s.x==e.x&&s.y==e.y)
return s.step;
for(int i = 0;i<4;i++){
t.x=s.x+dir[i][0];
t.y=s.y+dir[i][1];
if(map[t.x][t.y]==0){//可以走
t.step=s.step+1;
map[t.x][t.y]=1;//标记为墙
tp.push(t);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
point s,e;
int map[9][9]= {1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,};
scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
printf("%d\n",bfs(s,e,map));
}
return 0;
}