【BFS】WJ的逃离

码风依然没改变。。。

题目大意

给出一个地图,图中有障碍,求左上角到右下角的最少转弯数量。

Input

第一行两个数r,c表示地图大小
接下来r行,每行c个字符,‘*’代表此处有障碍,‘0’代表空地。

Output

一个数,表示最少需要几次转弯。数据保证有解。

数据范围

对于20%的数据,r、c≤10;
对于40%的数据,r、c≤100;
对于100%的数据,r、c≤500


思路

然而BFS(广搜)可以过。。。

  • 每到一个点,就把所有从这里出发,可以直线到达的点标记,加入队列。存下 位置拐弯数+1(起点的拐弯数+1)。
  • BFS先搜过的点一定是最优的,所以标记过的点不必再搜。
  • 为了方便,其实可以将1,1位置的拐弯数标记为-1先。
  • 一搜到目标点(r,c),输出,结束。
code
#include<cstdio>
int r,c,h,t,fx[5]={+1,-1,0,0},fy[5]={0,0,+1,-1};
char C[501][501];
struct wefjh{
	int x,y,z;
} a[250001];
int main(){
	scanf("%d%d",&r,&c);
	for(int i=1;i<=r;++i)
		for(int j=1;j<=c;++j)
		    while(C[i][j]!='0'&&C[i][j]!='*') 
			    scanf("%c",&C[i][j]);
	h=0;t=1;
	a[1].x=1;a[1].y=1;a[1].z=-1;
	while(h<t){
		h++;
		int lx,ly;
		for(int i=0;i<4;++i){
			lx=a[h].x;
			ly=a[h].y;
			while(C[lx+fx[i]][ly+fy[i]]=='0'&&lx+fx[i]>0&&lx+fx[i]<=r&&ly+fy[i]>0&&ly+fy[i]<=c){
				lx+=fx[i];
				ly+=fy[i];
				C[lx][ly]='*';
				if(lx==r&&ly==c){
					printf("%d",a[h].z+1);
					return 0;
				}
				a[++t].x=lx;
				a[t].y=ly;
				a[t].z=a[h].z+1;
			}
		}
	}
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值