POJ-3984-迷宫问题
http://poj.org/problem?id=3984
大概思路:进行普通的BFS,用队列来操作。在保存路径的时候,可以用栈来输出路径,利用先进后出的特性。
总结:头文件的正确使用,避免编译错误,数组大小的正确定义,避免越界。临时变量的使用不是很清楚。
<span style="color:#362e2b;">#include<iostream>
#include<queue>
#include<stack>
</span><span style="color:#ff0000;">#include<cstdio></span><span style="color:#362e2b;">
using namespace std;
int dp[10][10];
int map[5][5];
int dx[4]={0,0,1,-1};//上下左右
int dy[4]={1,-1,0,0};
int e[10][10];
typedef pair<int,int>P;
const int INF=1000000000;
queue<P>q;
void bfs(){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
dp[i][j]=0;
e[i][j]=0;
}
}
q.push(P(0,0));
dp[0][0]=1;
while(q.size()){
P p=q.front();q.pop();
if(p.first==4&&p.second==4) break;//如果等于结束元素则结束
for(int i=0;i<4;i++){
int nowx=p.first+dx[i];
int nowy=p.second+dy[i];
if(0<=nowx&&nowx<5&&0<=nowy&&nowy<5&&dp[nowx][nowy]==0&&map[nowx][nowy]!=1){
dp[nowx][nowy]=1;
q.push(P(nowx,nowy));
e[nowx][nowy]=p.first*10+p.second;
if(nowx==4&&nowy==4) return;
}
}
}
}
int main()
{
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
scanf("%d",&map[i][j]);
}
}
bfs();
stack<P>s;//利用栈先进后出的特性
int sox=4,soy=4;
while(1){
s.push(P(sox,soy));
if(sox==0&&soy==0) break;
</span><span style="color:#ff0000;">int x=sox,y=soy;//临时变量 ?
sox=e[x][y]/10;
soy=e[x][y]%10;</span><span style="color:#362e2b;">
}
while(!s.empty()){
P e=s.top();s.pop();
printf("(%d, %d)\n",e.first,e.second);
}
return 0;
}
</span>