POJ 3009 Curling 2.0

暴力DFS。

注意行列不要打错。。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn=30;
int n,m;
int a[maxn][maxn];
int ans;
int dir[4][2]=
{
    {1,0},
    {-1,0},
    {0,-1},
    {0,1},
};

void dfs(int x,int y,int cnt)
{
    if(cnt>10) return;
    if(cnt>=ans) return;
    if(a[x][y]==3) {ans=min(ans,cnt);return;}

    for(int i=0; i<4; i++)
    {
        int tmpx=x+dir[i][0],tmpy=y+dir[i][1];
        bool su=0;
        while(1)
        {
            if(tmpx<1||tmpx>n) break;
            else if(tmpy<1||tmpy>m) break;
            else if(a[tmpx][tmpy]==3)
            {
                dfs(tmpx,tmpy,cnt+1);
                break;
            }
            else if(a[tmpx][tmpy]==1)
            {
                if(su==1)
                {
                    a[tmpx][tmpy]=0;
                    dfs(tmpx-dir[i][0],tmpy-dir[i][1],cnt+1);
                    a[tmpx][tmpy]=1;
                }
                break;
            }
            tmpx=tmpx+dir[i][0];
            tmpy=tmpy+dir[i][1];
            su=1;
        }
    }
}

int main()
{
  //  freopen("G:\in.txt","r",stdin);
   // freopen("G:\out.txt","w",stdout);

    while(~scanf("%d%d",&m,&n))
    {
        if(!n&&!m) break;
        memset(a,0,sizeof a);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                scanf("%d",&a[i][j]);

        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(a[i][j]==2)
                {
                    ans=0x7FFFFFFF;
                    dfs(i,j,0);
                }
            }
        }

        if(ans==0x7FFFFFFF) ans=-1;
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5343630.html