POJ_3009_DFS

来源:互联网 发布:电子产品软件规格书 编辑:程序博客网 时间:2024/03/29 12:54

//============================================================================
// Name        : POJ_3009_DFS.cpp
// Author      : tiger
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
using namespace std;
int board[21][21];
int w,h;
int dir[4][2] = { {0,-1},{-1,0},{0,1},{1,0}};
int ans;
bool available(int x,int y)
{
    if(x < 0 || x >= h || y < 0 || y >= w)
        return false;
    return true;
}
bool dfs(int x,int y,int direct,int n)//x,y记录当前位置,direct表示到达本点时运动状态,n记录扔的次数
{

    int x0;
    int y0;
    bool f=false;
    int xx,yy;

    if(3 == board[x][y])//如果当前位置是终点,更新并返回
    {
        if(n < ans)
            ans = n;
        return true;
    }else if(1 == board[x][y])//如果当前位置是block
    {
        //记录当前位置
        f = true;
        xx = x;
        yy = y;
        //把当前位置block去掉
        board[xx][yy] = 0;

        //退回到上一个点
        x = x - dir[direct][0];
        y = y - dir[direct][1];
        //运动状态改为停止
        direct = -1;
    }

    //如果处于运动状态,继续沿此方向运动
    //注意此时当前位置肯定是空
    if(direct > -1)
    {
        x0 = x + dir[direct][0];
        y0 = y + dir[direct][1];

        if(available(x0,y0))
        {
            return dfs(x0,y0,direct,n);
        }
        else
         return false;
    }

    //如果是停滞状态
    //沿着四个方向各尝试扔一次

    n++;//累计

    if(n <= 10)//超过十次结束
    {
            for(int i = 0;  i < 4; i++)
            {
                x0 = x + dir[i][0];
                y0 = y + dir[i][1];
                if(available(x0,y0) && 1 != board[x0][y0])//越界或者下一个位置是block则不扔
                {
                    dfs(x0,y0,i,n);
                }
            }
    }
    //记得把block还原回去,保证此路径不会影响其他路径
    if(f) board[xx][yy] = 1;
    return true;
}

int main() {
    freopen("in","r",stdin);

    int i,j;
    int x,y;

    while(scanf("%d %d",&w,&h) && w)
    {
        for(i = 0; i < h; i++)
        {
            for(j = 0; j <w; j++)
            {
                scanf("%d",&board[i][j]);
                if(2 == board[i][j])
                {
                    x = i;
                    y = j;
                }
            }

        }
        ans = 15;
        dfs(x,y,-1,0);
        if(ans <= 10)
            printf("%d/n",ans);
        else
            printf("-1/n");
    }
    return 0;
}

原创粉丝点击