zoukankan      html  css  js  c++  java
  • 牛客哈理工小乐乐打游戏(bfs深度理解好题)

    题目链接:

    题意有些不清晰容易迷惑,注意2点:

    //向四周扩散是上下左右
    //岩浆可以把障碍物融化的意思是(并不是废话!):不能直接把障碍物#设为访问过的点(这样是90分,以后注意尽量分情况考虑不会错!),因为可能通过它向四周扩散!!!

    //另外注意,bfs好习惯写法,大前提最好放方面 结构更清晰 且 不易错!

    (因为岩浆遇到障碍物照样可以过,所以可以用所谓的曼哈顿距离求,即横坐标-横坐标+纵坐标-纵坐标)

    题目思路:本质就是比岩浆和小乐乐谁先到达终点而已!(所以2遍bfs是最好的,也可以想象成一个人在追另一个人)

      1 #include <iostream>
      2 #include <queue>
      3 using namespace std;
      4 const int maxn=1005;
      5 char a[maxn][maxn];
      6 int vis1[maxn][maxn],dis1[maxn][maxn];
      7 int vis2[maxn][maxn],dis2[maxn][maxn];
      8 int n,m;
      9 int sx,sy,gx,gy,hx,hy;
     10 struct px
     11 {
     12     int x;
     13     int y;
     14     px(){};
     15     px(int X,int Y):x(X),y(Y){};
     16 }p;
     17 
     18 void bfs1()
     19 {
     20     for(int i=0;i<=n+1;i++) for(int j=0;j<=m+1;j++) dis1[i][j]=1e9;
     21     vis1[hx][hy]=1;
     22     dis1[hx][hy]=0;
     23     queue<px> que;
     24     que.push(px(hx,hy));
     25 
     26     while(!que.empty())
     27     {
     28         p=que.front();
     29         que.pop();
     30         if(p.x==gx && p.y==gy) break;
     31 
     32         //
     33         if(p.y+1<=m)//大前提:最好放外边分清结构,清晰!(好习惯!)
     34         {
     35             //dis1[p.x][p.y+1]=dis1[p.x][p.y]+1;
     36             if(!vis1[p.x][p.y+1])
     37             {
     38                 vis1[p.x][p.y+1]=1;
     39                 dis1[p.x][p.y+1]=dis1[p.x][p.y]+1;
     40 
     41                 que.push(px(p.x,p.y+1));
     42             }
     43         }
     44         //
     45         if(p.x+1<=n)
     46         {
     47             //dis1[p.x+1][p.y]=dis1[p.x][p.y]+1;
     48             if(!vis1[p.x+1][p.y])
     49             {
     50                 vis1[p.x+1][p.y]=1;
     51                 dis1[p.x+1][p.y]=dis1[p.x][p.y]+1;
     52 
     53                 que.push(px(p.x+1,p.y));
     54             }
     55         }
     56         //
     57         if(p.x-1>=1)
     58         {
     59             //dis1[p.x-1][p.y]=dis1[p.x][p.y]+1;
     60             if(!vis1[p.x-1][p.y])
     61             {
     62                 vis1[p.x-1][p.y]=1;
     63                 dis1[p.x-1][p.y]=dis1[p.x][p.y]+1;
     64 
     65                 que.push(px(p.x-1,p.y));
     66             }
     67         }
     68         //
     69         if(p.y-1>=1)
     70         {
     71             //dis1[p.x][p.y-1]=dis1[p.x][p.y]+1;
     72             if(!vis1[p.x][p.y-1])
     73             {
     74                 vis1[p.x][p.y-1]=1;
     75                 dis1[p.x][p.y-1]=dis1[p.x][p.y]+1;
     76 
     77                 que.push(px(p.x,p.y-1));
     78             }
     79         }
     80     }
     81 }
     82 
     83 int bfs2()
     84 {
     85     for(int i=0;i<=n+1;i++) for(int j=0;j<=m+1;j++) dis2[i][j]=0;
     86     vis2[sx][sy]=1;
     87     dis2[sx][sy]=0;
     88     queue<px> que;
     89     que.push(px(sx,sy));
     90 
     91     while(!que.empty())
     92     {
     93         p=que.front();
     94         que.pop();
     95         if(p.x==gx && p.y==gy) return 1;
     96 
     97         //
     98         if(p.y+1<=m)
     99         {
    100             //dis2[p.x][p.y+1]=dis2[p.x][p.y]+1;
    101             if(!vis2[p.x][p.y+1] && a[p.x][p.y+1]!='#' && dis2[p.x][p.y]+1<dis1[p.x][p.y+1])
    102             {
    103                 vis2[p.x][p.y+1]=1;
    104                 dis2[p.x][p.y+1]=dis2[p.x][p.y]+1;
    105 
    106                 que.push(px(p.x,p.y+1));
    107             }
    108         }
    109         //
    110         if(p.x+1<=n)
    111         {
    112             //dis2[p.x+1][p.y]=dis2[p.x][p.y]+1;
    113             if(!vis2[p.x+1][p.y] && a[p.x+1][p.y]!='#' && dis2[p.x][p.y]+1<dis1[p.x+1][p.y])
    114             {
    115                 vis2[p.x+1][p.y]=1;
    116                 dis2[p.x+1][p.y]=dis2[p.x][p.y]+1;
    117 
    118                 que.push(px(p.x+1,p.y));
    119             }
    120         }
    121         //
    122         if(p.x-1>=1)
    123         {
    124             //dis2[p.x-1][p.y]=dis2[p.x][p.y]+1;
    125             if(!vis2[p.x-1][p.y] && a[p.x-1][p.y]!='#' && dis2[p.x][p.y]+1<dis1[p.x-1][p.y])
    126             {
    127                 vis2[p.x-1][p.y]=1;
    128                 dis2[p.x-1][p.y]=dis2[p.x][p.y]+1;
    129 
    130                 que.push(px(p.x-1,p.y));
    131             }
    132         }
    133         //
    134         if(p.y-1>=1)
    135         {
    136             //dis2[p.x][p.y-1]=dis2[p.x][p.y]+1;
    137             if(!vis2[p.x][p.y-1] && a[p.x][p.y-1]!='#' && dis2[p.x][p.y]+1<dis1[p.x][p.y-1])
    138             {
    139                 vis2[p.x][p.y-1]=1;
    140                 dis2[p.x][p.y-1]=dis2[p.x][p.y]+1;
    141 
    142                 que.push(px(p.x,p.y-1));
    143             }
    144         }
    145     }
    146     return 0;
    147 }
    148 
    149 int main()
    150 {
    151     ios::sync_with_stdio(false); cin.tie(0);
    152 
    153     while(cin>>n>>m)
    154     {
    155         for(int i=1;i<=n;i++)
    156         {
    157             for(int j=1;j<=m;j++)
    158             {
    159                 cin>>a[i][j];
    160 
    161                 if(a[i][j]=='S') { sx=i; sy=j; }
    162                 else if(a[i][j]=='E') { gx=i; gy=j; }
    163                 else if(a[i][j]=='F') { hx=i; hy=j; }
    164                 else if(a[i][j]=='#') { vis1[i][j]=1; vis2[i][j]=1;}
    165             }
    166         }
    167 
    168         bfs1();
    169         int ans=bfs2();
    170         if(ans) cout<<"PIG PIG PIG!"<<endl;
    171         else cout<<"A! WO SI LA!"<<endl;
    172 
    173         for(int i=0;i<=n+1;i++) for(int j=0;j<=m+1;j++) { vis1[i][j]=0; vis2[i][j]=0;}
    174     }
    175 
    176     return 0;
    177 }

    完。

  • 相关阅读:
    Java基础知识强化80:Math类random()方法的小扩展(控制产生目的数字的概率)
    Java基础知识强化79:被遗忘的Java Math类
    Java基础知识强化78:正则表达式之获取功能(案例)
    Java基础知识强化77:正则表达式之获取功能(Pattern 和 Matcher类的使用)
    Java基础知识强化76:正则表达式之替换功能
    Java基础知识强化75:正则表达式之分割功能(字符串中的数字排序案例)
    asp.net页面过滤所有换行符和多余空格
    nvelocity学习笔记
    ASP.NET session时间的设置
    Server的Transfer和Response的Redirect
  • 原文地址:https://www.cnblogs.com/redblackk/p/10076026.html
Copyright © 2011-2022 走看看