POJ_4127,用栈和队列实现BFS迷宫题目,但二维数组仍更常用
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
bool canotwalk[5][5];
struct point{
int i,j,distance;
}points[5][5];
queue<point> road;
stack<point> antiroad;
void update(point curr,int i,int j){
if(canotwalk[i][j]) points[i][j].distance=-1;
else if(!points[i][j].distance){
points[i][j].distance=curr.distance+1;
road.push(points[i][j]);
}
}
int main(){
int length;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
cin>>canotwalk[i][j];
for(int i=0;i<5;i++)
for(int j=0;j<5;j++){
points[i][j].distance=0;
points[i][j].i=i;
points[i][j].j=j;
}
points[0][0].distance=1;
road.push(points[0][0]);
while(!road.empty()){
point curr=road.front();
road.pop();
if(curr.i==4 && curr.j==4){
length=curr.distance;
break;
}
if(curr.i>0) update(curr,curr.i-1,curr.j);
if(curr.i<4) update(curr,curr.i+1,curr.j);
if(curr.j>0) update(curr,curr.i,curr.j-1);
if(curr.j<4) update(curr,curr.i,curr.j+1);
}
antiroad.push(points[4][4]);
while(1){
point curr=antiroad.top();
if(curr.distance==1){
while(!antiroad.empty()){
point temp=antiroad.top();
antiroad.pop();
cout<<"("<<temp.i<<", "<<temp.j<<")"<<endl;
}
return 0;
}
if(curr.i>0 && points[curr.i-1][curr.j].distance==curr.distance-1)
antiroad.push(points[curr.i-1][curr.j]);
if(curr.i<4 && points[curr.i+1][curr.j].distance==curr.distance-1)
antiroad.push(points[curr.i+1][curr.j]);
if(curr.j>0 && points[curr.i][curr.j-1].distance==curr.distance-1)
antiroad.push(points[curr.i][curr.j-1]);
if(curr.j<4 && points[curr.i][curr.j+1].distance==curr.distance-1)
antiroad.push(points[curr.i][curr.j+1]);
}
}