牛客哈理工小乐乐打游戏(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 }

完。

猜你喜欢

转载自www.cnblogs.com/redblackk/p/10076026.html