POJ-3984迷宫问题dfs

5*5的大小,不用担心会超时。
用了两遍DFS,第一遍找出最短路径,第二遍记录节点
 
 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
using namespace std;
int minn;
int t = 0;
int a[10][10],b[10][10];
int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};
struct node
{
	int px,py;
}p[100];
int is_out(int x,int y)
{
	if(x >= 0 && x < 5 && y >= 0 && y < 5) return 1;
	return 0;
}
void dfs1(int x,int y,int sum)
{
	if(x == 4 && y == 4)
	{
		minn = min (sum,minn);
		return;
	}
	for(int i = 0;i < 4;i++)
	{
		int xx = x + dx[i],yy = y + dy[i];
		if(is_out(xx,yy) && a[xx][yy] == 0 && b[xx][yy] == 0)
		{
			b[xx][yy] = 1;
			dfs1(xx,yy,sum + 1);
			b[xx][yy] = 0;
		}
	}
}
void dfs2(int x,int y,int sum)
{
	if(x == 4 && y == 4)
	{
		if(sum == minn && t == 0)
		{
			t = 1;
			for(int i = 0;i < sum;i++)
			{
				printf("(%d, %d)\n",p[i].px,p[i].py);
			}
		}
		return;
	}
	for(int i = 0;i < 4;i++)
	{
		int xx = x + dx[i],yy = y + dy[i];
		if(is_out(xx,yy) && a[xx][yy] == 0 && b[xx][yy] == 0)
		{
			b[xx][yy] = 1;
			p[sum].px = xx,p[sum].py = yy;
			dfs2(xx,yy,sum + 1);
			b[xx][yy] = 0;
		}
	}
}
int main()
{
	minn = 100;
	for(int i = 0;i < 5;i++)
	{
		for(int j = 0;j < 5;j++) scanf("%d",&a[i][j]);
	}
	memset(b,0,sizeof(b));
	dfs1(0,0,1);
	p[0].px = 0,p[0].py = 0;
	dfs2(0,0,1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ljq1998/article/details/75389308