POJ 3984 - 迷宫问题
2017-09-03 18:11
323 查看
题目大意:中文题。。。定义一个二维数组: 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
解题思路:建立一个模拟队列的结构体,其中包括x,y,pre。pre用于存储前一步的位置(结构体数组的位)。全局变量,标记数组,头尾位置。bfs先将起点读入,pre为-1。然后循环将起点上下左右判断是否能移动,能移动存入结构体,pre为这一次读入的位置的的数组位置(未出列时的头)。当移动后的位置为终点时退出。输出时dfs,如果pre未=-1,表示没到起点,进入下一层,直到到起点,输出,回上一层输出。
ac代码:
解题思路:建立一个模拟队列的结构体,其中包括x,y,pre。pre用于存储前一步的位置(结构体数组的位)。全局变量,标记数组,头尾位置。bfs先将起点读入,pre为-1。然后循环将起点上下左右判断是否能移动,能移动存入结构体,pre为这一次读入的位置的的数组位置(未出列时的头)。当移动后的位置为终点时退出。输出时dfs,如果pre未=-1,表示没到起点,进入下一层,直到到起点,输出,回上一层输出。
ac代码:
#include <iostream> using namespace std; struct node{ int x; int y; int pre; }no[50]; int dx[4]={-1, 1, 0, 0}, dy[4]={0, 0, -1, 1}; int front, rear, a[5][5], vis[5][5]; void bfs() { int temp1, temp2, X, Y; front = rear = 0; for (int i=0; i<5; i++) for (int j=0; j<5; j++){ vis[i][j] = 0; if (a[i][j]) vis[i][j] = 1; } no[0].x = no[0].y = 0; no[0].pre = -1; rear++; while (front < rear){ temp1 = no[front].x, temp2 = no[front].y; if (temp1 == 4 && temp2 == 4) return ; front++; for (int i=0; i<4; i++){ X = temp1 + dx[i]; Y = temp2 + dy[i]; if (X >= 0 && X < 5 && Y >= 0 && Y < 5 && !vis[X][Y]){ no[front].x = X, no[front].y = Y, no[front].pre = front-1; vis[X][Y] = 1; rear++; } } } } void prin(node n) { if (n.pre == -1) printf("(%d, %d)\n", n.x, n.y); else{ prin(no[n.pre]); printf("(%d, %d)\n", n.x, n.y); } } int main() { while (scanf("%d", &a[0][0])!=EOF){ for (int i=0; i<5; i++) for (int j=0; j<5; j++) if (i || j) scanf("%d", &a[i][j]); bfs(); prin(no[front]); } return 0; }
相关文章推荐
- poj_3984迷宫问题
- POJ 3984 迷宫问题【bfs路径打印】
- 【POJ 3984】迷宫问题
- poj 3984- 迷宫问题
- poj 3984:迷宫问题
- 搜索练习3 /poj.org/problem 3984 迷宫问题/bfs 回溯找路经
- POJ 3984 迷宫问题 【DFS】
- poj 3984 迷宫问题 (广度优先BFS)
- POJ 3984 迷宫问题
- POJ 3984 迷宫问题
- POJ 3984 迷宫问题 (BFS做法)
- poj_3984 迷宫问题
- poj 3984 迷宫问题 学会了一招计算路径
- POJ 3984迷宫问题(记录路径)
- poj 3984 迷宫问题
- POJ 3984 迷宫问题 (路径记录)
- poj_3984_迷宫问题_(bfs+记录路径)
- POJ 3984 迷宫问题
- POJ-3984-迷宫问题
- POJ 3984 迷宫问题(广度搜索)