码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3984 迷宫问题 搜索题解

时间:2014-08-11 12:08:02      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:使用   io   数据   for   问题   line   amp   size   

本题可以使用BFS和DFS解题,也可以构建图,然后利用Dijsktra解题。

不过因为数据很少,就没必要使用Dijsktra了。

BFS和DFS效率都是一样的,因为都需要搜索所有可能的路径,并记录最短路径和当前路径。

推荐使用DFS,感觉会方便很多,BFS会麻烦很多,因为需要记录并比较路径。


#include <stdio.h>
#include <string.h>
#include <limits.h>

const int MAX_N = 5;
const int MAX_RES = MAX_N*MAX_N;
int Maze[MAX_N][MAX_N];
int Row[MAX_RES], Col[MAX_RES], resRow[MAX_RES], resCol[MAX_RES], N;
const int BLOCK = 1;
const int UNBLOCK = 0;

inline bool isLegal(int r, int c)
{
	return 0<=r && 0<=c && r<MAX_N && c<MAX_N && Maze[r][c] == 0;
}

void getPath(int path = 0, int r = 0, int c = 0)
{
	Row[path] = r, Col[path] = c;
	if (r == MAX_N - 1 && c == MAX_N - 1)
	{
		if (path+1 < N)
		{
			N = path+1;
			memcpy(resRow, Row, sizeof(int)*N);
			memcpy(resCol, Col, sizeof(int)*N);
		}
		return ;
	}
	Maze[r][c] = BLOCK;
	if (isLegal(r, c+1)) getPath(path+1, r, c+1);
	if (isLegal(r+1, c)) getPath(path+1, r+1, c);
	if (isLegal(r, c-1)) getPath(path+1, r, c-1);
	if (isLegal(r-1, c)) getPath(path+1, r-1, c);
	Maze[r][c] = UNBLOCK;
}

int main()
{
	for (int i = 0; i < MAX_N; i++)
	{
		for (int j = 0; j < MAX_N; j++)
		{
			scanf("%d", Maze[i]+j);
		}
	}
	N = INT_MAX;
	getPath();
	if (N != INT_MAX)
	{
		for (int i = 0; i < N; i++)
		{
			printf("(%d, %d)\n", resRow[i], resCol[i]);
		}
	}
	return 0;
}



POJ 3984 迷宫问题 搜索题解,布布扣,bubuko.com

POJ 3984 迷宫问题 搜索题解

标签:使用   io   数据   for   问题   line   amp   size   

原文地址:http://blog.csdn.net/kenden23/article/details/38488101

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!