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


    }
}

  

posted @ 2012-03-30 21:41  Szz  阅读(149)  评论(0编辑  收藏  举报