poj3009

#include<iostream>
using namespace std;
int data[20][20];
int sx,sy;
int m,n;//m行n列
int minstep;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};



void dfs(int x, int y, int step)
{
    if(step==11)
        return;
    if(step>=minstep)
        return;
    for(int i=0;i<4;i++)
    {
        int nx,ny;
        nx=x+dx[i];
        ny=y+dy[i];
        if(data[nx][ny]==1||nx<0||nx>=m||ny<0||ny>=n)
            continue;
        while(1)
        {
            if(data[nx][ny]==3)
            {
                if(step<minstep)
                    minstep=step;
                return;
            }
            if(i==0&&nx==0)
                break;
            if(i==1&&ny==n-1)
                break;
            if(i==2&&nx==m-1)
                break;
            if(i==3&&ny==0)
                break;
            else if(data[nx+dx[i]][ny+dy[i]]==1)
            {
                data[nx+dx[i]][ny+dy[i]]=0;
                dfs(nx,ny,step+1);
                data[nx+dx[i]][ny+dy[i]]=1;
                break;
            }
            nx=nx+dx[i];
            ny=ny+dy[i];
        }
    }
}



int main()
{
    //freopen("input.txt","r",stdin);
    while(cin>>n>>m)
    {
        if(n==0||m==0)
            break;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>data[i][j];
                if(data[i][j]==2)
                {
                    sx=i;
                    sy=j;
                    data[i][j]=0;
                }
            }
        }
        minstep=9999;
        dfs(sx,sy,1);
        if(minstep==9999)
            cout<<"-1"<<endl;
        else
            cout<<minstep<<endl;
    }
    return 0;
}

 

posted on 2017-05-03 09:26  bbcai  阅读(85)  评论(0编辑  收藏  举报