现在的位置: 首页 > 综合 > 正文

POJ 3009 Curling 2.0 DFS

2013年08月15日 ⁄ 综合 ⁄ 共 825字 ⁄ 字号 评论关闭

题意:冰球游戏,和迷宫类似,但是每一次碰到障碍则在障碍的旁边停下来,并且障碍被击碎。此时可以重新值掷一次冰球。当掷球次数超过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;
}

抱歉!评论已关闭.