WJ(J)的逃离
题目大意:
有一个n×m的矩阵,*是不可走的,0是可走的,求1,1到n,m的最小转弯次数
原题:
题目描述
当WJ醒来时,发现自己被困在一个地图的左上角,幸好WJ有张图,并了解到出口正是迷宫的右下角,至少有一条路径可以到达出口。
整个地图有些地方会有障碍(保证左上角右下角没有),WJ可以快速奔跑,只是需要拐弯时令人很不爽。为了保持心情愉悦,WJ想知道最少需要几次转弯。
输入
第一行两个数r,c表示地图大小
接下来r行,每行c个字符,‘*’代表此处有障碍,‘0’代表空地。
输出
一个数,表示最少需要几次转弯。数据保证有解。
输入样例
2 5
0*000
000*0
输出样例
4
说明
【数据范围】
对于20%的数据,r、c≤10;
对于40%的数据,r、c≤100;
对于100%的数据,r、c≤500。
解题思路:
用bfs来计算,从1,1开始向四周延伸,如果可以走就一直走,而且每一列或行都是1,1的最小转弯次数-1(为了方便用-1),然后下一个点,一直下去,知道找到就直接输出退出
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,xx,yy,gg[505][505],p[505][505],a[250005],b[250005],c[250005];
const int dx[4]={0,-1,0,1};
const int dy[4]={1,0,-1,0};
char x;
void bfs()
{int j,head=0,tail=1;a[1]=1;//横坐标b[1]=1;//纵坐标c[1]=-1;//转弯次数,为了方便p[1][1]=1;//记录do{head++;for (int i=0;i<4;++i){j=1;xx=a[head]+dx[i]*j;//往这个方向走yy=b[head]+dy[i]*j;while (!gg[xx][yy]&&xx>0&&xx<=n&&yy>0&&yy<=m)//只要不撞墙或出界就一直走{if (!p[xx][yy])//没到过{a[++tail]=xx;//入队b[tail]=yy;c[tail]=c[head]+1;//加一p[xx][yy]=1;//记录if (xx==n&&yy==m)//判断是否到了{printf("%d",c[tail]);//到了return;//因为是bfs,所以先到就一定是最优的}}j++;//继续走xx=a[head]+dx[i]*j;yy=b[head]+dy[i]*j;}}}while(head<tail);
}
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=n;++i){getchar();for (int j=1;j<=m;++j){x=getchar();//输入if (x=='*') gg[i][j]=1;//记录}}bfs();
}