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 }

 

posted @ 2013-01-23 23:57  琳&leen  阅读(174)  评论(0编辑  收藏  举报