zoukankan      html  css  js  c++  java
  • POJ 3083 Children of the Candy Corn DFS及BFS搜索

    http://poj.org/problem?id=3083
    一开始没明白题意以为只是简单的(顺时针或逆时针),wa一次。。。。
    1、至于求最短距离,毋庸置疑,肯定是bfs,这个就不多说了
    
    2、对于向左和向右的理解上,我当初一直不明白,读了老长时间,没有看懂,到discuss里看了一个人的叙述,终于明白意思了……就是这样,一直沿着向左或向右的方向走,能走就走,不能走就回撤,所以这个dfs不能标记遍历过的点,这是很显然的。
    
    3、dfs方向的选择,就是要保证沿着向左或者向右的方向走
    ( 向左是顺时针,向右是逆时针转)
    
    #include<stdio.h>
    #include<string.h>
    #define N 100
    #include<queue>
    using namespace std;
    char map[N][N];
    int step,sx,sy,ex,ey,r,c,vis[N][N];
    int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
    int dr[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
    struct node
    {
        int x,y,step;
    }q[N*N];
    
    void dfs_l(int x,int y,int dir)
    {
    
        if(x==ex&&y==ey)return;
        int t=(dir+3)%4;
        int dx=x+dl[t][0];
        int dy=y+dl[t][1];
        if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
        {
            step++;
            dfs_l(dx,dy,t);
    
        }
        else
        {
    
             int dx=x+dl[dir][0];
             int dy=y+dl[dir][1];
              if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
           {
              step++;
               dfs_l(dx,dy,dir);
    
           }
           else
           {
               int t=(dir+1)%4;
               int dx=x+dl[t][0];
               int dy=y+dl[t][1];
                if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
              {
                   step++;
                   dfs_l(dx,dy,t);
    
              }
              else
              {
                     int t=(dir+2)%4;
                    int dx=x+dl[t][0];
                     int dy=y+dl[t][1];
                if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
                {
                   step++;
                   dfs_l(dx,dy,t);
    
                }
              }
           }
        }
    
    
    }
    void dfs_r(int x,int y,int dir)
    {
    
        if(x==ex&&y==ey)return;
        int t=(dir+1)%4;
        int dx=x+dl[t][0];
        int dy=y+dl[t][1];
        if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
        {
            step++;
            dfs_r(dx,dy,t);
    
        }
        else
        {
             int t=dir;
             int dx=x+dl[t][0];
             int dy=y+dl[t][1];
              if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
           {
              step++;
               dfs_r(dx,dy,t);
    
           }
           else
           {
               int t=(dir+3)%4;
               int dx=x+dl[t][0];
               int dy=y+dl[t][1];
                if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
              {
                   step++;
                   dfs_r(dx,dy,t);
    
              }
              else
              {      int t=(dir+2)%4;
                    int dx=x+dl[t][0];
                    int dy=y+dl[t][1];
                if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
                {
                   step++;
                   dfs_r(dx,dy,t);
    
                }
              }
           }
        }
    }
    int  bfs(int x,int y)
    {
    
       int head=0,tail=0;
       q[head].x=x;
       q[head].y=y;
       q[head].step=1;
       vis[x][y]=1;
       tail++;
       while(head<tail)
       {
    
           for(int i=0;i<4;i++)
           {
                int dx=q[head].x+dl[i][0];
                int dy=q[head].y+dl[i][1];
                int num=q[head].step;
                if(dx==ex&&dy==ey)return num+1;
                else
                {
                    if(dx>=0&&dx<r&&dy>=0&&dy<c&&map[dx][dy]!='#')
                    {
                        if(!vis[dx][dy])
                        {
                            vis[dx][dy]=1;
                            q[tail].x=dx;
                         q[tail].y=dy;
                         q[tail].step=num+1;
                         tail++;
                        }
    
                    }
    
                }
           }
           head++;
       }
       return 0;
    
    }
    int main()
    {
        int t,i,j;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&c,&r);
            getchar();
            for(i=0;i<r;i++)
            {
                scanf("%s",map[i]);
            }
            for(i=0;i<r;i++)
            {
                for(j=0;j<c;j++)
                {
                    if(map[i][j]=='S')
                    {
                        sx=i;
                        sy=j;
                    }
                    if(map[i][j]=='E')
                    {
                        ex=i;
                        ey=j;
                    }
                }
            }
            //printf("%d %d   %d %d\n",sx,sy,ex,ey);
    
               int dir;
            if(sx==0)
            dir=3;
            else if(sx==r-1)
            dir=1;
            else if(sy==0)
            dir=2;
            else
            dir=0;
            int k=dir;
            step=0;
             dfs_l(sx,sy,dir);
            printf("%d ",step+1);
    
            dir=k;
            step=0;
            dfs_r(sx,sy,dir);
    
            printf("%d ",step+1);
    
             memset(vis,0,sizeof(vis));
            int ans=bfs(sx,sy);
            printf("%d\n",ans);
    
    
        }
    }
    

      

  • 相关阅读:
    2018QBXT刷题游记(4)
    洛谷 P4302 字符串折叠 题解
    hdu5009 Paint Pearls 题解
    CF467C George and Job 题解
    洛谷P2622 关灯问题II 题解
    洛谷 P3049园林绿化 题解
    洛谷 P1064 金明的预算方案 题解
    洛谷P1979 华容道 题解
    2018QBXT刷题游记(3)
    2018QBXT刷题游记(2)
  • 原文地址:https://www.cnblogs.com/acSzz/p/2426076.html
Copyright © 2011-2022 走看看