poj3984迷宫问题
一个5 × 5的二维数组,表示一个迷宫。其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
很简单的一道题,迷宫问题,一般都选择两种优先搜索方法去解,最短路线问题应该要用BFS,而不是DFS. 这道题目还需要记录路线,所以还加有存储父节点的一个空间。
贴代码如下(发现我只要是这两种方法,代码写的都不短啊):
#include<iostream> #include<queue> #include<vector> using namespace std; typedef class{ public: int x,y; int fx,fy; }vertex; int maze[5][5]; int trace[5][5]={0}; vertex record[5][5]; void BFS() { vertex start,end,v,n; start.x=0;start.y=0; end.x=4;end.y=4; trace[0][0]=1; record[0][0]=start; queue<vertex> dfq; vector<vertex> path; dfq.push(start); while(dfq.size()!=0) { v=dfq.front(); dfq.pop(); if(v.x-1>=0&&maze[v.x-1][v.y]!=1&&trace[v.x-1][v.y]==0) { trace[v.x-1][v.y]=1; n.x=v.x-1;n.y=v.y;n.fx=v.x;n.fy=v.y; dfq.push(n); record[n.x][n.y]=n; } if(v.x+1<=4&&maze[v.x+1][v.y]!=1&&trace[v.x+1][v.y]==0) { trace[v.x+1][v.y]=1; n.x=v.x+1;n.y=v.y;n.fx=v.x;n.fy=v.y; dfq.push(n); record[n.x][n.y]=n; } if(v.y-1>=0&&maze[v.x][v.y-1]!=1&&trace[v.x][v.y-1]==0) { trace[v.x][v.y-1]=1; n.x=v.x;n.y=v.y-1;n.fx=v.x;n.fy=v.y; dfq.push(n); record[n.x][n.y]=n; } if(v.y+1<=4&&maze[v.x][v.y+1]!=1&&trace[v.x][v.y+1]==0) { trace[v.x][v.y+1]=1; n.x=v.x;n.y=v.y+1;n.fx=v.x;n.fy=v.y; dfq.push(n); record[n.x][n.y]=n; } } int flag=1,x=4,y=4; while(flag) { vertex w=record[x][y]; path.push_back(w); if(x==0&&y==0) flag=0; else{ x=w.fx;y=w.fy; } } for(int i=path.size()-1;i>=0;i--) { cout<<"("<<path[i].x<<", "<<path[i].y<<")"<<endl; } } int main() { for(int i=0;i<5;i++) for(int j=0;j<5;j++) { cin>>maze[i][j]; } BFS(); return 0; }