您的位置:首页 > 其它

POJ 3009 Curling 2.0 DFS

2011-09-08 13:20 363 查看
题意:冰球游戏,和迷宫类似,但是每一次碰到障碍则在障碍的旁边停下来,并且障碍被击碎。此时可以重新值掷一次冰球。当掷球次数超过10次则输出-1.

题解:
#include <iostream>
using namespace std;

#define INF 100000000
int map[21][21], dir[4][2] = { {0,-1}, {1,0}, {0,1}, {-1,0} };
int h, w, si, sj, res, step;

void dfs( int x, int y )
{
step++;
if ( step > 10 || step >= res )
return;
int a, b;
for ( int i = 0; i < 4; i++ )
{
a = x + dir[i][0];
b = y + dir[i][1];
if ( a >= h || a < 0 || b >= w || b < 0 || map[a][b] == 1) continue;
while ( map[a][b] == 2 || map[a][b] == 0 )
{
a += dir[i][0];
b += dir[i][1];
if ( a >= h || a < 0 || b >= w || b < 0 ) break;
}
if ( a >= h || a < 0 || b >= w || b < 0 ) continue;
if ( map[a][b] == 3 )
{
res = step;
return;
}
if ( map[a][b] == 1 )
{
map[a][b] = 0;
dfs(a-dir[i][0],b-dir[i][1]);
step--;
map[a][b] = 1;
}
}
}

int main()
{
while ( cin >> w >> h && w && h )
{
memset(map,0,sizeof(map));
for ( int i = 0; i < h; i++ )
{
for ( int j = 0; j < w; j++ )
{
cin >> map[i][j];
if ( map[i][j] == 2 )
{
si = i;
sj = j;
}
}
}
res = INF;
step = 0;
dfs( si, sj );
if ( res <= 10 )
cout << res << endl;
else
cout << -1 << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  游戏