poj-3009 Curling 2.0

[题目链接]

思路:只是一个dfs搜索题,还是太菜,come on,baby
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int Max_n=110;
const int Max_m=110;

int n,m;
int s[Max_n][Max_n];
int step;

void dfs(int x,int y,int k){
    if(k>=10)return;
    if(s[x-1][y]!=1){
        for(int i=x-1;i>=1;i--){
            if(s[i][y]==3){step=min(step,k+1);return;}
            if(s[i][y]==1){
                s[i][y]=0;
                dfs(i+1,y,k+1);
                s[i][y]=1;
                break;
            }
        }
    }
    if(s[x+1][y]!=1){
        for(int i=x+1;i<=n;i++){
            if(s[i][y]==3){step=min(step,k+1);return;}
            if(s[i][y]==1){
                s[i][y]=0;
                dfs(i-1,y,k+1);
                s[i][y]=1;
                break;
            }
        }
    }
    if(s[x][y+1]!=1){
        for(int i=y+1;i<=m;i++){
            if(s[x][i]==3){step=min(step,k+1);return;}
            if(s[x][i]==1){
                s[x][i]=0;
                dfs(x,i-1,k+1);
                s[x][i]=1;
                break;
            }
        }
    }
    if(s[x][y-1]!=1){
        for(int i=y-1;i>=1;i--){
            if(s[x][i]==3){step=min(step,k+1);return;}
            if(s[x][i]==1){
                s[x][i]=0;
                dfs(x,i+1,k+1);
                s[x][i]=1;
                break;
            }
        }
    }
}

int main()
{
    while(~scanf("%d%d",&m,&n)&&n+m){
        memset(s,0,sizeof(s));
        step=inf;
        int x,y;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&s[i][j]);
                if(s[i][j]==2){x=i;y=j;}
            }
        }
        dfs(x,y,0);
        if(step!=inf)printf("%d\n",step);
        else printf("-1\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/80368589