#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <stack>
using namespace std;
typedef pair<int,int> P;
const int INF=1<<30;
int maze[10][10];
int dis[10][10];
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
stack<P> s;
int abs(int x){
return x>0?x:-x;
}
void bfs(){
queue<P> q;
q.push(P(0,0));
dis[0][0]=0;
while(!q.empty()){
P p=q.front();
q.pop();
if(p.first==4&&p.second==4){
break;
}
for(int i=0;i<4;i++){
int nx=p.first+dx[i],ny=p.second+dy[i];
if(nx>=0&&nx<5&&ny>=0&&ny<5&&maze[nx][ny]==0&&dis[nx][ny]==INF){
q.push(P(nx,ny));
dis[nx][ny]=dis[p.first][p.second]+1;
// cout<<nx<<" "<<ny<<" "<<dis[nx][ny]<<endl;
}
}
}
}
int main(){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
dis[i][j]=INF;
}
}
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&maze[i][j]);
}
}
bfs();
int redis=dis[4][4];
s.push(P(4,4));
redis--;
while(1){
int flag=0;
if(redis==0){
s.push(P(0,0));
break;
}
for(int i=4;i>=0;i--){
for(int j=4;j>=0;j--){
int dx=i-s.top().first;
int dy=j-s.top().second;
if(dis[i][j]==redis&&(abs(dx)+abs(dy)==1)){
s.push(P(i,j));
redis--;
flag=1;
break;
}
}
if(flag) break;
}
}
while(!s.empty()){
printf("(%d, %d)\n",s.top().first,s.top().second);
s.pop();
}
return 0;
}
POJ 3984 迷宫问题(BFS+打印路径)
最新推荐文章于 2021-02-27 15:16:52 发布