zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    js-xlsx实现文件导出、下载(excel)
    css多行文本显示省略号
    八数码问题-A*算法-Java实现
    vue内置组件-transtion
    《javascript高级程序设计》(第三版)读书笔记
    html比较实用的字符实体
    vuex的个人理解
    前端路由
    函数节流(throttle)和防抖(debounce)
    audio音频
  • 原文地址:https://www.cnblogs.com/wanglin2011/p/2874099.html
Copyright © 2011-2022 走看看