POJ - 3984 - 迷宫问题 (DFS)

迷宫问题

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 10936   Accepted: 6531

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 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

思路:DFS题。找到每一条路取最短路径

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define INF 0x3fffffff
using namespace std;

int mp[5][5];

int ans;
struct node {
	int x;
	int y;
}lu[30], pa[30];

bool vis[8][8];

const int dir[4][2] = {-1, 0, 1, 0, 0, 1, 0, -1};

void dfs(int x, int y, int deep) {
	if(x == 4 && y == 4 && deep < ans) {
		ans = deep;
		for(int i = 0; i < deep; i ++) {
			pa[i].x = lu[i].x;
			pa[i].y = lu[i].y;
		}
	}
	for(int i = 0; i < 4; i ++) {
		int tx = x + dir[i][0];
		int ty = y + dir[i][1];
		if(tx < 0 || tx > 4 || ty < 0 || ty > 4) continue;
		if(mp[tx][ty] == 0 && !vis[tx][ty]) {
			vis[tx][ty] = true;
			lu[deep].x = tx;
			lu[deep].y = ty;
			dfs(tx, ty, deep + 1);
			vis[tx][ty] = false;
		}
	}
}

int main() {
	for(int i = 0; i < 5; i ++) {
		for(int j = 0; j < 5; j ++) {
			scanf("%d", &mp[i][j]);
		}
	}
	memset(lu, 0, sizeof(lu));
	memset(pa, 0, sizeof(pa));
	memset(vis, false, sizeof(vis));
	ans = INF;
	lu[0].x = lu[0].y = 0;
	vis[0][0] = true;
	dfs(0, 0, 1);
	for(int i = 0; i < ans; i ++) {
		printf("(%d, %d)\n", pa[i].x, pa[i].y);
	}
	return 0;
}
时间: 2024-10-23 22:14:42

POJ - 3984 - 迷宫问题 (DFS)的相关文章

POJ 3984 迷宫问题 搜索题解

本题可以使用BFS和DFS解题,也可以构建图,然后利用Dijsktra解题. 不过因为数据很少,就没必要使用Dijsktra了. BFS和DFS效率都是一样的,因为都需要搜索所有可能的路径,并记录最短路径和当前路径. 推荐使用DFS,感觉会方便很多,BFS会麻烦很多,因为需要记录并比较路径. #include <stdio.h> #include <string.h> #include <limits.h> const int MAX_N = 5; const int

BFS(最短路+路径打印) POJ 3984 迷宫问题

题目传送门 1 /* 2 BFS:额,这题的数据范围太小了.但是重点是最短路的求法和输出路径的写法. 3 dir数组记录是当前点的上一个点是从哪个方向过来的,搜索+,那么回溯- 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-4 9:02:06 8 File Name :POJ_3984.cpp 9 ********************

poj 3984:迷宫问题(广搜,入门题)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 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表示可以走的路,只能横着走或竖着走,不能斜着走,要

POJ 3984 迷宫问题(简单bfs+路径打印)

传送门: http://poj.org/problem?id=3984 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33105   Accepted: 18884 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, }; 它表示一个

POJ 3984 迷宫问题 bfs 难度:0

http://poj.org/problem?id=3984 典型的迷宫问题,记录最快到达某个点的是哪个点即可 #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=10; const int inf=0x3fffffff; struct pnt { int x,y; pnt(){x=y=0;} pnt(int tx,int ty){x=tx,y

POJ 3984 迷宫问题 bfs

题目链接:迷宫问题 天啦撸.最近怎么了.小bug缠身,大bug 不断.然这是我大腿第一次给我dbug.虽然最后的结果是.我............bfs入队列的是now.............. 然后.保存路径的一种用的string .一种用的数组.大同小异.根据就是我bfs 先搜到的绝壁就是步数最少的. 附代码: pre 数组 1 /* 2 很简单的广搜.如果不是+路径输出的话.. 3 保存路径. 4 */ 5 6 #include <stdio.h> 7 #include <str

POJ 3984 迷宫问题 _BFS

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define CL(x, y) memset(x, y, sizeof(x)) 6 using namespace std; 7 const int MAX = 5; 8 int N, i, j, a, b, flag; 9 int chessboard[MAX*MAX], used

poj 3984 迷宫问题 (BFS+记录路径)

题目连接:http://poj.org/problem?id=3984 题解:简单的BFS+记录路径,具体题解看代码注释. #include <iostream> #include <queue> #include <cstdio> using namespace std; struct point { int x; int y; }; queue<point>q; int map[5][5]; int vis[5][5];//标记走过的路 int g[4]

POJ - 3984 迷宫问题 (搜索)

Problem 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 左上角到右下角的最短路径,格式如