POJ 3984 迷宫问

来源:互联网 发布:celery python廖雪 编辑:程序博客网 时间:2024/05/16 08:27
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 16370 Accepted: 9783

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 00 1 0 1 00 0 0 0 00 1 1 1 00 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。搜索出来的路径一定是最小路径。

#include<stdio.h>int maze[7][7] = {0};int used[7][7] = {0};int finished = 0;struct point{int prei;int prej;int i;int j;};struct direct{int i;int j;}dir[4] = {-1, 0, 0, 1, 1, 0, 0, -1};struct point queue1[30];struct point stack1[30];struct point stack2[30];int front1 = 0;int rear1 = 0; int top1 = -1;int top2 = -1;void bfs(){int i, j;int d;int newi, newj;struct point tmp = {0, 0, 1, 1};struct point tmp2;used[1][1] = 1;queue1[rear1 ++] = tmp;while(front1 != rear1 && !finished){tmp = queue1[front1 ++];stack1[++ top1] = tmp;for(d = 0; d < 4; d ++){newi = tmp.i + dir[d].i;newj = tmp.j + dir[d].j;if(!used[newi][newj] && !maze[newi][newj]){used[newi][newj] = 1;tmp2.i = newi;tmp2.j = newj;tmp2.prei = tmp.i;tmp2.prej = tmp.j;queue1[rear1 ++] = tmp2;if(newi == 5 && newj == 5){finished = 1;stack1[++ top1] = tmp2;break;}}}}}int main(){int i, j;int prei, prej;struct point tmp;for(i = 0; i < 7; i ++){for(j = 0; j < 7; j ++){if(i == 0 || i == 6) maze[i][j] = 1;else if(j == 0 || j == 6) maze[i][j] = 1;else continue;}}for(i = 1; i <= 5; i ++){for(j = 1; j <= 5; j ++)scanf("%d", &maze[i][j]);}bfs();while(top1 != -1){if(stack1[top1].i == prei && stack1[top1].j == prej || stack1[top1].i == 5 && stack1[top1].j == 5){tmp = stack1[top1 --];stack2[++ top2] = tmp;prei = tmp.prei;prej = tmp.prej;}else{top1 --;}}while(top2 != -1){printf("(%d, %d)\n", stack2[top2].i - 1, stack2[top2].j - 1);top2 --;}return 0;}

0 0