最小转弯问题(bfs)

涉及考点:bfs(宽度优先搜索算)

最小转弯问题

题目描述:给出一张地图,这张地图被分为 n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图 1,最少的拐弯次数为5。
最小转弯问题(bfs)_第1张图片

分析:由题意得,这道题可以用bfs,最优化问题
本题唯一要注意的是要让拐弯代价相同。
我们可以用一个while循环来实现一直走到底在拐弯数加1!!

code:

#include
#include
using namespace std;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
int m,n,a[31][31],sx,sy,lx,ly,f[1010][4];
void bfs()
{
	int head=0,tail=1;
	f[1][1]=sx,f[1][2]=sy,f[1][3]=0;  //初始化
	do
	{
		head++;
		for(int i=0;i<4;i++)  //方向扩展
		{
			int nx=f[head][1]+dx[i];
			int ny=f[head][2]+dy[i];
			while(nx>=1&&nx<=m&&ny>=1&&ny<=n&&a[nx][ny]==0)  //一直走到底
			{
				if(nx==lx&&ny==ly)  //判断是否到达目标点!
				{
					cout<<f[tail][3];
					return ;
				}
				tail++;
				a[nx][ny]=1;
				f[tail][1]=nx;
				f[tail][2]=ny;
				f[tail][3]=f[head][3]+1;  //实现代价相同
				nx=nx+dx[i];
				ny=ny+dy[i];
			} 
			
		}
	}while(head<tail);
}
int main()
{
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
		cin>>a[i][j];
	cin>>sx>>sy>>lx>>ly;
	bfs();
	return 0;
} 

谢谢

你可能感兴趣的:(bfs)