Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4)(4, 4)
SOURCE:点击打开链接
解析:
经典的BFS寻找最短路问题,不同的是需要输出最短路,所以要定义一个father的结构体用来存储某个点的父节点,BFS完成之后再用回溯法将节点输出即可。
代码:
#include <iostream> #include <cstring> #include <queue> using namespace std; typedef pair<int,int> p; struct father { int x; int y; } par[5][5]; int array[5][5]; int dx[4]= {-1,0,1,0}; int dy[4]= {0,1,0,-1}; bool vis[5][5]; void bfs(); void dfs(const int x,const int y); int main(void) { memset(vis,0,sizeof(vis)); for(int i=0; i<5; i++) for(int j=0; j<5; j++) cin>>array[i][j]; bfs(); dfs(4,4); cout<<"(4, 4)"<<endl; return 0; } void bfs() { int nx,ny; queue<p> q; p p1; q.push(p(0,0)); vis[0][0]=1; par[0][0].x=5,par[0][0].y=5; while(q.size()) { p1=q.front(); q.pop(); if(p1.first==4&&p1.second==4) break; for(int i=0; i<4; i++) { nx=p1.first+dx[i]; ny=p1.second+dy[i]; if(nx>=0&&nx<5&&ny>=0&&ny<5&&array[nx][ny]==0&&!vis[nx][ny]) { q.push(p(nx,ny)); par[nx][ny].x=p1.first; par[nx][ny].y=p1.second; vis[nx][ny]=1; } } } } void dfs(const int x,const int y) { if(x==0&&y==0) return; else dfs(par[x][y].x,par[x][y].y); cout<<"("<<par[x][y].x<<", "<<par[x][y].y<<")"<<endl; }