poj3009

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
#define N 200000
#include<queue>
using namespace std;
int a,b;
int vis[30][30];
int linshi,daan,s_x,s_y,g_x,g_y;
int  dir[4][2]={0,-1,-1,0,0,1,1,0};
int qiang(int x,int y){
if(vis[x][y]==1)return 1;
return 0;
}
int chujie(int x,int y){
return (x<0||y<0||x==b||y==a);
}
void dfs(int x,int y,int n){
if(n>10)return ;

for(int i=0;i<4;i++){
int xx=x,yy=y;
    xx+=dir[i][0];
    yy+=dir[i][1];
    if(chujie(xx,yy)){
            continue;
    }
    if(qiang(xx,yy)){
        continue;
    }
    if(xx==g_x&&yy==g_y){
        daan=min(daan,n);
        continue;
    }
    while(1){
        xx+=dir[i][0];
        yy+=dir[i][1];
        if(chujie(xx,yy)){
            break;
        }
        if(qiang(xx,yy)){
            vis[xx][yy]=0;
            dfs(xx-dir[i][0],yy-dir[i][1],n+1);
            vis[xx][yy]=1;
            break;
        }
        if(xx==g_x&&yy==g_y){
            daan=min(daan,n);
            break;
        }
    }
}
}
int main(){
freopen("input2.txt","r",stdin);
while(scanf("%d%d",&a,&b)&&a!=0&&b!=0){
        daan=12;
       for(int i=0;i<b;i++){
        for(int j=0;j<a;j++){
            cin>>linshi;
            if(linshi==1){
                vis[i][j]=1;
            }
            else vis[i][j]=0;
        if(linshi==2){

            s_x=i;
            s_y=j;
        }
       else if(linshi==3){
            g_x=i;
            g_y=j;
        }

        }
       }

dfs(s_x,s_y,1);
if(daan==12)cout<<"-1\n";
else cout<<daan<<endl;
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40675883/article/details/82726726