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);





    }

}

  

你可能感兴趣的:(children)