[poj3984]迷宫问题_bfs

迷宫问题

    题目大意:给你一个5*5的矩阵,求左上角到左下角的最短路径。

    注释:0或1的矩阵,1表示不能走,0表示能走,保证有唯一最短路径。

      想法:bfs爆搜练习题。通过其实点,定义方向数组,然后进行bfs遍历即可。

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct Pair
{
	int x,y;
};
int a[10][10];
queue<Pair> q;
Pair before[10][10];
Pair ans[50];
bool dis[10][10];
int d[5][3]={{0,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
bool check(int x,int y)//判断当前点是否合法
{
	if(x>=0&&x<=4&&y>=0&&y<=4&&a[x][y]==0) return true;
	return false;
}
int main()
{
	for(int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	Pair mid;
	mid.x=0;
	mid.y=0;
	q.push(mid);//起始暴搜点
	dis[0][0]=1;
	while(!q.empty())
	{
		mid=q.front();q.pop();
		int x=mid.x,y=mid.y;
		if(x==4&&y==4) break;
		for(int i=1;i<=4;i++)
		{
			if(check(x+d[i][1],y+d[i][2])&&dis[x+d[i][1]][y+d[i][2]]==false)
			{
				dis[x+d[i][1]][y+d[i][2]]=1;
				Pair c;
				c.x=x+d[i][1];c.y=y+d[i][2];
				q.push(c);before[c.x][c.y]=mid;
			}
		}
	}
	Pair k;
	k.x=4,k.y=4;
	int cnt=0;
	ans[++cnt]=k;
	bool flag=false;
	while(1)
	{
		if(flag) break;
		k=before[k.x][k.y];
		ans[++cnt]=k;
		if(!k.x&&!k.y) flag=true; 
	}
	for(int i=cnt;i>=1;i--)//答案要求从左上角输出至右下角
	{
		printf("(%d, %d)
",ans[i].x,ans[i].y);
	}
	return 0;
}

     小结:水题,注意bfs时需要pop以及边界特判。方向数组的第二维如果从一开始有意义的话需要多写一个0.

原文地址:https://www.cnblogs.com/ShuraK/p/8661592.html