【bfs】WJ的逃离
生活随笔
收集整理的這篇文章主要介紹了
【bfs】WJ的逃离
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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(); }總結
以上是生活随笔為你收集整理的【bfs】WJ的逃离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一尺九是多少厘米 尺跟厘米是怎么换算的
- 下一篇: 【高精】Oliver的成绩(jzoj 2