HDOJ 1728 逃离迷宫(BFS,拐弯次数最少)

HDOJ 1728

开始拿到这道题,想到先前写过的BFS,由出口到终点,最短路径。后来一看题目不是这个意思,题目要求拐弯数最少到达终点而不是求最短路径。
看了解题报告,有了一点点思路,就是先选定一条方向,然后把该方向上所有能拐的弯都拐了。也就是说,运动的方向不仅仅是周围的四个点,因为没求最短时间,为了避免BFS提前结束,就把四个方向搜索到底。
注意,这里记录拐弯数的K的初始值不是0而是-1,因为第一个选定的方向不算在内。
PS:这道题目好坑啊,题目给的x是列,y是行,为了方便自己理解,我在输入的时候特地先输入y后输入x,然后就可以当做正常理解的x,y。

然而这题卡我最多的是我没有memset,vis的数组没有初始化。。。。所以养成良好的编程习惯很重要,一定要初始化数组。

AC:

#include<iostream>
#include<cstdio>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define maxn 110
struct node{
    int x,y,d; //d存放之前已经拐弯次数
};
int x1,y1,x2,y2,k,n,m,t;
char mp[maxn][maxn];
bool vis[maxn][maxn];
int dir[4][2]={1,0,-1,0,0,1,0,-1};

void bfs(node vs,node vd){
    int flag=0;
    node sta,end;
    queue<node > que;
    sta.x =vs.x; sta.y =vs.y ;sta.d=-1; //第一次之前-1
    vis[vs.x][vs.y]=true;
    que.push (sta);

    while(!que.empty ()){
        sta=que.front ();
        que.pop();
        if(sta.x==vd.x && sta.y==vd.y && sta.d<=k){
            flag=1;break;
        }
        end.d=sta.d+1; //前面搜完了一个方向肯定要拐弯
        {
            int i;
            for(i=0;i<4;i++){
                int nx=sta.x +dir[i][0];
                int ny=sta.y+dir[i][1];
                while(nx>=0 &&nx<n &&ny>=0 &&ny<m &&mp[nx][ny]!='*'){
                    if(!vis[nx][ny]){
                        end.x=nx; end.y=ny;
                        que.push(end);
                        vis[nx][ny]=true;
                    }
                    nx+=dir[i][0]; //单方向优先扩展
                    ny+=dir[i][1];
                }
            }
        }
    }
    printf("%s\n",flag?"yes":"no");
}


int main(){
    int i,j;
    cin>>t;
    while(t--){
        node vs,vd;
        memset(vis,false,sizeof(vis));//初始化!!
        cin>>n>>m;
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                cin>>mp[i][j];
            }
        }
        cin>>k>>y1>>x1>>y2>>x2;
        vs.x=x1-1;vs.y=y1-1;
        vd.x=x2-1;vd.y=y2-1;
        bfs(vs,vd);

    }
    return 0;
}
    原文作者:BFS
    原文地址: https://blog.csdn.net/qq_37360631/article/details/76999765
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞