Poj——3009Curling 2.0

Curling 2.0

 

题目大意:

在二维平面内有一个冰壶开始在起点S,要到终点T,推冰壶冰壶会一直走到出界,碰到障碍物会停下,并且障碍物会消失,求最少多少步完成.

 

剪枝即可,即$step>ans$回溯即可

 

#include<iostream>
#include<cstdio>

using namespace std;

int ma[105][105],n,m,sx,sy,ans;

int dx[]={0,0,1,-1},
    dy[]={1,-1,0,0};

bool judge(int x,int y){
    return x>=1&&x<=n&&y>=1&&y<=m;
}

void dfs(int x,int y,int step){
    if(step>=ans) return;
    for(int i=0;i<4;i++){
        int tx=x+dx[i],ty=y+dy[i];
        if(judge(tx,ty)&&ma[tx][ty]!=1){
            while(true){
                if(!judge(tx,ty)) break;
                if(ma[tx][ty]==3){
                    ans=min(ans,step);
                    return;
                }
                if(ma[tx][ty]==1){
                    ma[tx][ty]=0;
                    dfs(tx-dx[i],ty-dy[i],step+1);
                    ma[tx][ty]=1;
                    break;
                }
                tx+=dx[i],ty+=dy[i];
            }
        }
    }
}

int main()
{
    while(scanf("%d%d",&m,&n)==2&&n&&m){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)    {
                scanf("%d",&ma[i][j]);
                if(ma[i][j]==2) sx=i,sy=j;
            }
        ans=11;
        dfs(sx,sy,1);
        if(ans==11) printf("%d\n",-1);
        else printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2018-09-17 17:10  清风我已逝  阅读(157)  评论(0)    收藏  举报