poj 3083 Children of the Candy Corn(dfs+bfs)
题目:http://poj.org/problem?id=3083
这个题吧,没什么难点,就是题意有点难懂,后来问了一下ZP,知道了是什么意思后就开始敲了,敲了一半,QC让我再去讲题,结果回到宿舍又把剩下的敲完的
提交,然后1A
题意主要是:
给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走
先输出左转优先时,从S到E的步数
再输出右转优先时,从S到E的步数
最后输出S到E的最短步数
我设置的四个方向是,面向下为1,面向左为2,面向上为3,面向右为4
代码:
View Code
1 #include <iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int m,n; 6 int map[45][45]; 7 int s[4][2]={{-1,0},{1,0},{0,1},{0,-1}}; 8 struct node 9 { 10 int x,y; 11 int num; 12 }que[20000]; 13 char str[45][45]; 14 int lsum=0; 15 int flag; 16 int rsum=0; 17 void bfs(int sx,int sy) 18 { 19 int i; 20 int head,tail; 21 memset(map,0,sizeof(map)); 22 que[0].x=sx; 23 que[0].y=sy; 24 que[0].num=1; 25 head=0; 26 tail=1; 27 map[sx][sy]=1; 28 while(head<tail) 29 { 30 int xi; 31 int yi; 32 for(i=0;i<4;i++) 33 { 34 xi=que[head].x+s[i][0]; 35 yi=que[head].y+s[i][1]; 36 if(str[xi][yi]=='E') 37 { 38 cout<<que[head].num+1<<endl; 39 return ; 40 } 41 if(str[xi][yi]=='.'&&xi>=1&&xi<=n&&yi>=1&&yi<=m&&map[xi][yi]==0) 42 { 43 que[tail].x=xi; 44 que[tail].y=yi; 45 que[tail].num=que[head].num+1; 46 map[xi][yi]=1; 47 tail++; 48 } 49 } 50 head++; 51 } 52 53 } 54 void ldfs(int ax,int ay,int dec) 55 { 56 if(flag) 57 return; 58 if(str[ax][ay]=='E') 59 { 60 lsum++; 61 flag=1; 62 return ; 63 } 64 if(!flag) 65 { 66 if(dec==1) 67 { 68 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 69 { 70 lsum++; 71 ldfs(ax,ay+1,4); 72 if(flag) 73 return ; 74 } 75 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 76 { 77 lsum++; 78 ldfs(ax+1,ay,1); 79 if(flag) 80 return ; 81 } 82 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 83 { 84 lsum++; 85 ldfs(ax,ay-1,2); 86 if(flag) 87 return ; 88 } 89 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 90 { 91 lsum++; 92 ldfs(ax-1,ay,3); 93 if(flag) 94 return ; 95 } 96 } 97 else if(dec==2) 98 { 99 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 100 { 101 lsum++; 102 ldfs(ax+1,ay,1); 103 if(flag) 104 return ; 105 } 106 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 107 { 108 lsum++; 109 ldfs(ax,ay-1,2); 110 if(flag) 111 return ; 112 } 113 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 114 { 115 lsum++; 116 ldfs(ax-1,ay,3); 117 if(flag) 118 return ; 119 } 120 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 121 { 122 lsum++; 123 ldfs(ax,ay+1,4); 124 if(flag) 125 return ; 126 } 127 128 } 129 else if(dec==3) 130 { 131 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 132 { 133 lsum++; 134 ldfs(ax,ay-1,2); 135 if(flag) 136 return ; 137 } 138 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 139 { 140 lsum++; 141 ldfs(ax-1,ay,3); 142 if(flag) 143 return ; 144 } 145 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 146 { 147 lsum++; 148 ldfs(ax,ay+1,4); 149 if(flag) 150 return ; 151 } 152 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 153 { 154 lsum++; 155 ldfs(ax+1,ay,1); 156 if(flag) 157 return ; 158 } 159 } 160 else 161 { 162 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 163 { 164 lsum++; 165 ldfs(ax-1,ay,3); 166 if(flag) 167 return ; 168 } 169 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 170 { 171 lsum++; 172 ldfs(ax,ay+1,4); 173 if(flag) 174 return ; 175 } 176 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 177 { 178 lsum++; 179 ldfs(ax+1,ay,1); 180 if(flag) 181 return ; 182 } 183 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 184 { 185 lsum++; 186 ldfs(ax,ay-1,2); 187 if(flag) 188 return ; 189 } 190 } 191 } 192 return ; 193 } 194 void rdfs(int ax,int ay,int dec) 195 { 196 if(flag) 197 return; 198 if(str[ax][ay]=='E') 199 { 200 rsum++; 201 flag=1; 202 return ; 203 } 204 if(!flag) 205 { 206 if(dec==1) 207 { 208 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 209 { 210 rsum++; 211 rdfs(ax,ay-1,2); 212 if(flag) 213 return ; 214 } 215 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 216 { 217 rsum++; 218 rdfs(ax+1,ay,1); 219 if(flag) 220 return ; 221 } 222 223 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 224 { 225 rsum++; 226 rdfs(ax,ay+1,4); 227 if(flag) 228 return ; 229 } 230 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 231 { 232 rsum++; 233 rdfs(ax-1,ay,3); 234 if(flag) 235 return ; 236 } 237 } 238 else if(dec==2) 239 { 240 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 241 { 242 rsum++; 243 rdfs(ax-1,ay,3); 244 if(flag) 245 return ; 246 } 247 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 248 { 249 rsum++; 250 rdfs(ax,ay-1,2); 251 if(flag) 252 return ; 253 } 254 255 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 256 { 257 rsum++; 258 rdfs(ax+1,ay,1); 259 if(flag) 260 return ; 261 } 262 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 263 { 264 rsum++; 265 rdfs(ax,ay+1,4); 266 if(flag) 267 return ; 268 } 269 270 } 271 else if(dec==3) 272 { 273 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 274 { 275 rsum++; 276 rdfs(ax,ay+1,4); 277 if(flag) 278 return ; 279 } 280 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 281 { 282 rsum++; 283 rdfs(ax-1,ay,3); 284 if(flag) 285 return ; 286 } 287 288 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 289 { 290 rsum++; 291 rdfs(ax,ay-1,2); 292 if(flag) 293 return ; 294 } 295 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 296 { 297 rsum++; 298 rdfs(ax+1,ay,1); 299 if(flag) 300 return ; 301 } 302 } 303 else 304 { 305 if(ax+1<=n&&(str[ax+1][ay]=='.'||str[ax+1][ay]=='E')) 306 { 307 rsum++; 308 rdfs(ax+1,ay,1); 309 if(flag) 310 return ; 311 } 312 if(ay+1<=m&&(str[ax][ay+1]=='.'||str[ax][ay+1]=='E')) 313 { 314 rsum++; 315 rdfs(ax,ay+1,4); 316 if(flag) 317 return ; 318 } 319 320 if(ax-1>=1&&(str[ax-1][ay]=='.'||str[ax-1][ay]=='E')) 321 { 322 rsum++; 323 rdfs(ax-1,ay,3); 324 if(flag) 325 return ; 326 } 327 if(ay-1>=1&&(str[ax][ay-1]=='.'||str[ax][ay-1]=='E')) 328 { 329 rsum++; 330 rdfs(ax,ay-1,2); 331 if(flag) 332 return ; 333 } 334 } 335 } 336 return ; 337 } 338 int main() 339 { 340 int t; 341 342 cin>>t; 343 int sx,sy; 344 int i,j; 345 int f; 346 while(t--) 347 { 348 cin>>m>>n; 349 for(i=1;i<=n;i++) 350 { 351 for(j=1;j<=m;j++) 352 { 353 cin>>str[i][j]; 354 if(str[i][j]=='S') 355 { 356 sx=i; 357 sy=j; 358 } 359 } 360 } 361 if(sx==1) 362 f=1; 363 if(sx==n) 364 f=3; 365 if(sy==1) 366 f=4; 367 if(sy==m) 368 f=2; 369 flag=0; 370 lsum=0; 371 ldfs(sx,sy,f); 372 cout<<lsum<<" "; 373 flag=0; 374 rsum=0; 375 rdfs(sx,sy,f); 376 cout<<rsum<<" "; 377 bfs(sx,sy); 378 } 379 return 0; 380 }