【POJ3009】深度搜索

  题干网址: 点击打开链接

  注意对碰到边界情况的处理,注意对impossible情况的处理,对最小步数的剪枝了解一下,了解一下......

#include <iostream>

using namespace std;

int flag = 0;
int go[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};
int a[32][32];
int minStep = 0;
int m,n;    //矩阵长宽

void dfs(int x,int y,int step)
{
    //cout<<"enter"<<step<<endl;
    if(step >= 10 || step>minStep)
    {
        return;
    }
    for(int i=0;i<4;i++)
    {
        //cout<<"enter for"<<endl;

        int xx = x;
        int yy = y;

        //cout<<xx<<" "<<yy<<" "<<endl;    //0 1

        while((xx>=0)&&(xx<n)&&(yy>=0)&&(yy<m))
        {
            //cout<<"xx yy:"<<xx<<" "<<yy<<endl;
            //cout<<"enter while"<<a[xx][yy]<<" "<<step<<endl;   //0 0
            if(a[xx][yy] == 0 )     //空白
            {
                xx = xx+go[i][0];
                yy = yy+go[i][1];
            }
            if(a[xx][yy] == 3)     //目的地
            {
                if(step+1 < minStep)
                    minStep = step+1;
                xx = -1;
                //cout<<minStep<<endl;
            }
            if(a[xx][yy] == 1)
            {
                if(!((xx-go[i][0] == x) && (yy - go[i][1] == y))){
                    a[xx][yy] = 0;
                    dfs(xx-go[i][0],yy-go[i][1],step+1);
                    //退后一步再投
                    a[xx][yy] = 1;
                }
                xx = -1;
                //返回操作
            }
        }

    }


}

int main()
{

    int s_x,s_y;  //起始位置
    int e_x,e_y;  //结束位置
    while(cin>>m>>n,m!=0)
    {
        //cin>>m>>n;
        //cout<<m<<endl;
        //cout<<n<<endl;
        for(int i = 0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                cin>>a[j][i];

                if(a[j][i] == 2)
                {
                    s_x = j;
                    s_y = i;
                }
                if(a[j][i] == 3)
                {
                    e_x = j;
                    e_y = i;
                }

                //cout<<a[j][i]<<" ";
            }
        a[s_x][s_y] = 0;
        minStep = 11;
        dfs(s_x,s_y,0);
        //输出判断
        if(minStep > 10)
        {
            cout<<-1<<endl;
        }
        else
        {
            cout<<minStep<<endl;
        }

        minStep = 0;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值