您的位置:首页 > 其它

POJ 3009 Curling 2.0 回溯,dfs 难度:0

2015-06-05 21:55 302 查看
http://poj.org/problem?id=3009

如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍)

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 21;
int maz[maxn][maxn];
int n,m;
const int dx[4] = {1,-1,0,0};
const int dy[4] = {0,0,1,-1};

bool in(int x,int y)
{
return x >= 0 && x < n  && y >= 0 && y < m;
}

bool dfs(int x,int y,int step)
{
if(step == 0)return maz[x][y] == 3;
for(int i = 0; i < 4; i++)
{
int tx = x + dx[i],ty = y + dy[i];
if(maz[tx][ty] == 1)continue;
while(in(tx,ty) && maz[tx][ty] == 0)
{
tx += dx[i];
ty += dy[i];
}
if(!in(tx,ty))continue;
if(maz[tx][ty] == 3)return true;
maz[tx][ty] = 0;
if(dfs(tx - dx[i],ty - dy[i],step - 1))
{
return true;
}
maz[tx][ty] = 1;
}
return false;
}
int main()
{
while(scanf("%d%d",&m,&n) == 2 && (m || n))
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d",maz[i] + j);
}
}
for(int x = 0; x < n; x++)
{
for(int y = 0; y < m; y++)
{
if(maz[x][y] == 2)
{
maz[x][y] = 0;
bool fl = false;
for(int i = 0; i < 11; i++)
{
if(dfs(x, y ,i))
{
fl = true;
printf("%d\n",i);
break;
}
}
if(!fl)
{
puts("-1");
}
break;
}
}
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: