题目链接:http://poj.org/problem?id=3984
迷宫问题 Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 24560 Accepted: 14338
Description
定义一个二维数组: 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 0Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
题解:
简单的BFS输出路径。
由于每个格子只能从一个格子转移过来(开始格子除外),所以开了fa[x][y][2]三维数组来存格子xy的上一个格子。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #include <string> #include <set> #define ms(a,b) memset((a),(b),sizeof((a))) using namespace std; typedef long long LL; const int INF = 2e9; const LL LNF = 9e18; const int MOD = 1e9+7; const int MAXN = 5+10; struct node { int x, y; }; int m[MAXN][MAXN], fa[MAXN][MAXN][2], vis[MAXN][MAXN]; int dir[4][2] = { 1,0,0,1,-1,0,0,-1 }; queue<node>que; void bfs() { while(!que.empty()) que.pop(); node now, tmp; now.x = now.y = 0; vis[0][0] = 1; que.push(now); while(!que.empty()) { now = que.front(); que.pop(); if(now.x==4 && now.y==4) return; for(int i = 0; i<4; i++) { tmp.x = now.x + dir[i][0]; tmp.y = now.y + dir[i][1]; if(tmp.x>=0 && tmp.x<=4 && tmp.y>=0 && tmp.y<=4 && !vis[tmp.x][tmp.y] && !m[tmp.x][tmp.y]) { vis[tmp.x][tmp.y] = 1; fa[tmp.x][tmp.y][0] = now.x; fa[tmp.x][tmp.y][1] = now.y; que.push(tmp); } } } } void Print(int x, int y) { if(x!=0 || y!=0) Print(fa[x][y][0], fa[x][y][1]); printf("(%d, %d)\n", x,y); } int main() { for(int i = 0; i<5; i++) for(int j = 0; j<5; j++) scanf("%d",&m[i][j]); bfs(); Print(4,4); }