码风依然没改变。。。
题目大意
给出一个地图,图中有障碍,求左上角到右下角的最少转弯数量。
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;
}
}
}
}