题目链接:
题意有些不清晰容易迷惑,注意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 }
完。