zoukankan      html  css  js  c++  java
  • hdu1728 逃离迷宫bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1728/

    关于广度优先搜索的第一篇题解。广度优先搜索,就是状态树的层次遍历,一层一层的搜索,直到搜索到目标状态为止。在扩展的过程中设定一种由上一层扩展到下一层的转化机制,将出现的新的状态放入队列之中,每次取出队首元素,大部分情况下bfs是用来搜索最优值的问题,优先队列的作用就是一旦搜索到目标状态,跟随的结果状态一定是最优的。为了避免重复相同的搜索,可设置访问记录。一般运用队列这种数据结构,使得最初搜索的状态在前,可以继续下一次搜索。

    题目意思:给出地图,要求判断在最多k次转弯的条件下是否能够从一点都到另一点。写完记得检查变量的初始化。

    代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef unsigned int ui;
     4 typedef long long ll;
     5 typedef unsigned long long ull;
     6 #define pf printf
     7 #define mem(a,b) memset(a,b,sizeof(a))
     8 #define prime1 1e9+7
     9 #define prime2 1e9+9
    10 #define pi 3.14159265
    11 #define lson l,mid,rt<<1
    12 #define rson mid+1,r,rt<<1|1
    13 #define scand(x) scanf("%llf",&x) 
    14 #define f(i,a,b) for(int i=a;i<=b;i++)
    15 #define scan(a) scanf("%d",&a)
    16 #define dbg(args) cout<<#args<<":"<<args<<endl;
    17 #define inf 0x3f3f3f3f
    18 #define maxn 105
    19 #define maxm 2000010
    20 int n,m,t,k;
    21 int Map[maxn][maxn];
    22 int sx,sy,tx,ty;
    23 bool flag=false,vis[maxn][maxn];
    24 int dir[][2]={0,1,0,-1,1,0,-1,0};
    25 struct node{
    26     int x,y;
    27     int step;
    28     node(int x,int y,int step):x(x),y(y),step(step){};
    29     node(){};
    30 }; 
    31 node cur,nxt;
    32 void bfs()
    33 {
    34     queue<node>q;
    35     node st(sx,sy,-1);
    36     q.push(st);
    37     vis[sx][sy]=true;//标记该状态已经访问过 
    38     while(!q.empty())
    39     {
    40         cur=q.front();//获取队首结点
    41         q.pop();//队首状态弹出 
    42         if(cur.x==tx&&cur.y==ty&&cur.step<=k)
    43         {
    44         //    dbg(cur.step);
    45             flag=true;
    46             return;
    47         }
    48         f(i,0,3)
    49         {
    50             nxt=cur;
    51             nxt.x+=dir[i][0];
    52             nxt.y+=dir[i][1];
    53             while(nxt.x>=0&&nxt.x<n&&nxt.y>=0&&nxt.y<m&&Map[nxt.x][nxt.y])//检查是否越界、可走 
    54             {
    55                 if(!vis[nxt.x][nxt.y])//只要没有访问过,那一定是经过转弯了的,我们设定一次朝着一个方向一直走到底 
    56                 {
    57                     vis[nxt.x][nxt.y]=true;
    58                     nxt.step=cur.step+1;
    59                     q.push(nxt);//合法状态入队 
    60                 }
    61                 nxt.x+=dir[i][0];
    62                 nxt.y+=dir[i][1];//继续朝同一个方向走到底,这个方向上的step都是同一个值 
    63             }
    64         }
    65     }
    66 }
    67 int main()
    68 {
    69     //freopen("input.txt","r",stdin);
    70     //freopen("output.txt","w",stdout);
    71     std::ios::sync_with_stdio(false);
    72     scan(t);
    73     while(t--)
    74     {
    75         flag=false;
    76         scan(n);
    77         scan(m);
    78         mem(Map,0);
    79         mem(vis,false);
    80         char c;
    81         f(i,0,n-1)
    82             f(j,0,m-1)
    83             {
    84                 scanf(" %c",&c);
    85                 if(c=='.')Map[i][j]=1;
    86             }
    87             scanf("%d%d%d%d%d",&k,&sy,&sx,&ty,&tx);//注意数据的读入,行列不可错 
    88             sx--,sy--,tx--,ty--;
    89             bfs();
    90             if(flag)pf("yes
    ");
    91             else pf("no
    ");
    92      } 
    93  } 
  • 相关阅读:
    最容易懂的红黑树
    Chapter 9 (排序)
    【WC2013】糖果公园
    【Luogu1903】数颜色
    【笔记】Sigmoid函数
    【笔记】费马小定理、数论欧拉定理
    【笔记】单层感知机
    2020ICPC.小米 网络选拔赛第一场
    【Luogu3366】模板:最小生成树
    Codeforces Raif Round 1
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12506915.html
Copyright © 2011-2022 走看看