【poj 3083】Children of the Candy Corn 中文题意&题解&代码(C++)

题目链接:
http://poj.org/problem?id=3083
中文题意:
表示这个人写比较清楚。。
http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122369.html
每次默认向上为刚开始的方向。
及其恶心的题,bfs加dfs
代码:

#include
#include
#include
#include
#include
using namespace std;
int ans1,ans2,dis[45][45],flag,T,n,m,f[45][45],opx,opy,edx,edy;
int der[2][4]={{-1,0,1, 0},
           { 0,-1,0,1}};
struct node{
    int x;int y;
};
char c[45];
queueq;
void dfs1(int x,int y,int step,int d)
{
    if (flag==1) return ;
    if (x==edx && y==edy)
    {
        ans1=step;flag=1;
        return ;
    }
    for (int i=3;i<=6;i++)
    {
            int nex=x+der[0][(d+i)%4];
            int ney=y+der[1][(d+i)%4];
        if (nex>=1 && nex<=n && ney>=1 && ney<=m)
        {
            if (f[nex][ney]==0)
            dfs1(nex,ney,step+1,(d+i)%4);
        }
    }
}
void dfs2(int x,int y,int step,int d)
{
        if (flag==1) return ;
        if (x==edx && y==edy)
        {
                ans2=step;flag=1;
                return ;
        }

        for (int i=1;i>=-2;i--)
        {
                int nex=x+der[0][(d+i+4)%4];
                int ney=y+der[1][(d+i+4)%4];
                if (nex>=1 && nex<=n && ney>=1 && ney<=m)
                {

                        if (f[nex][ney]==0)
                        dfs2(nex,ney,step+1,(d+i+4)%4);
                }
        }
}
void bfs(int x,int y)
{
    node op;
    op.x=opx;
    op.y=opy;
    q.push(op);
    flag=0;
    dis[opx][opy]=1;
    while(flag==0 && !q.empty())
    {
        node now=q.front();
        q.pop();
        for (int i=0;i<=3;i++)
        {
            int nex=now.x+der[0][i];
            int ney=now.y+der[1][i];
            if ( nex>=1 && nex<=n && ney>=1 && ney<=m)
            {
                if (f[nex][ney]==0 && dis[nex][ney]==-1)
                {
                    dis[nex][ney]=dis[now.x][now.y]+1;
                                node ne;
                                ne.x=nex;
                                ne.y=ney;
                                q.push(ne);
                }
            }
            if (nex==edx&&ney==edy)
            {
                flag=1;
                break;
            }
        }
    }
}
int main()
{
    scanf("%d",&T);
    for (int t=1;t<=T;t++)
    {
        memset(dis,-1,sizeof(dis));
        while(!q.empty())
        q.pop();
        scanf("%d%d",&n,&m);
        for (int i=1;i<=m;i++)
        {
            scanf("%s",c);
            for (int j=0;jif (c[j]=='#')  f[j][i]=1;
                else f[j][i]=0;
                if (c[j]=='S')  opy=i,opx=j;
                if (c[j]=='E')  edy=i,edx=j;
            }
        }
        flag=0;
        dfs1(opx,opy,1,1);
        flag=0;
        dfs2(opx,opy,1,1);
        bfs(opx,opy);

        printf("%d %d %d\n",ans1,ans2,dis[edx][edy]);   
    }
}

你可能感兴趣的:(oi之路,poj)