【poj 3009】Curling 2.0 中文题意&题解&代码(C++)

题目链接:
http://poj.org/problem?id=3009

题意:

比较清楚的题意:
http://blog.csdn.net/lyy289065406/article/details/6647671
直接dfs搜。。。

代码:

#include
#include
#include
#include
using namespace std;
int mina,flag,opx,opy,edx,edy,n,m,f[25][25];
int de[2][4]={{1,-1,0, 0},
          {0, 0,1,-1}};
void dfs(int x,int y,int sta,int d,int step)
{
    if (step>10 || step>=mina) return ;
    if (x==edx && y==edy) 
    {
        mina=min(mina,step);
        return ;
    }
    if (sta==1)
    {
        int nex=x+de[0][d];
        int ney=y+de[1][d];
        if (nex<1 || nex>n || ney<1 || ney>m)   return ;
        if (f[nex][ney]==0 || f[nex][ney]==3)
        dfs(nex,ney,sta,d,step);
        if (f[nex][ney]==1)
        {
            f[nex][ney]=0;
            dfs(x,y,0,d,step);
            f[nex][ney]=1;
        }
    }
    if (sta==0)
    {
        for (int i=0;i<4;i++)
        {
            int nex=x+de[0][i];
                    int ney=y+de[1][i];
            if (nex<1 || nex>n || ney<1 || ney>m)   continue ;
            if (f[nex][ney]!=1)
            dfs(nex,ney,1,i,step+1);
        }
    }
}
int main()
{
    while(scanf("%d%d",&m,&n))
    {
        if (n==0 && m==0) return 0;
        mina=9999;
        for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        {
            scanf("%d",&f[i][j]);
            if (f[i][j]==2)
            {
                opx=i;opy=j;
                f[i][j]=0;
            }
            else if (f[i][j]==3)
            edx=i,edy=j;
        }
        dfs(opx,opy,0,0,0);
        if (mina==9999)
        printf("-1\n");
        else
        printf("%d\n",mina);
    }
}

你可能感兴趣的:(poj)