//============================================================================
// 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;
}
POJ_3009_DFS
最新推荐文章于 2020-09-21 16:33:27 发布