HDU 1045 Fire Net(DFS)

本文深入探讨了深度优先搜索(DFS)算法在游戏地图优化中的应用,详细讲解了如何利用DFS进行有效的路径搜索和机关枪放置策略。通过实例代码解析,展示了剪枝条件的重要性,以及如何设置状态和参数来提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题属于较为简单的dfs题
题意很清楚,剪枝条件就是这个点的左边和上边不能在‘X’之前出现一个机关枪,这些约束条件全部写到剪枝函数中去

dfs函数中跟平常基本框架类似,因为假设某一个点可以放机关枪,那么它可以选择放或不放,两种情况都有可能取最大值。但如果一个点不能放机关枪,那么它这个点就只能选择不放,然后再搜下一个状态dfs(k + 1)

AC代码如下:

/*
4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0
*/
#include<iostream>
using namespace std;

const int maxn = 5;
int n;
char maze[maxn][maxn];
int sum;
int max_res;

bool jianzhi(int x, int y)
{
	if(maze[x][y] != '.')
		return false;
	for(int i = x - 1;i >= 1;i--)
	{
		if(maze[i][y] == 'X')
			break;
		if(maze[i][y] == '@')
			return false;
	}
	for(int i = y - 1;i >= 1;i--)
	{
		if(maze[x][i] == 'X')
			break;
		if(maze[x][i] == '@')
			return false;
	}	
	return true;
}



void dfs(int k)
{
	if(k == n * n + 1)
	{
		if(sum > max_res)
		{
			max_res = sum;
			/*测试代码 
			for(int i = 1;i <= n;i++)
			{
				for(int j = 1;j <= n;j++)
				{
					cout << maze[i][j] << " ";
				}
				cout << endl;
			}
			*/
		}
	}
	else
	{
		int x, y;
		if(k % n == 0)
		{
			x = k / n;
			y = n;
		}
		else
		{
			x = (k / n) + 1;
			y = k % n;
		}
		if(jianzhi(x, y))
		{
			maze[x][y] = '@';
			sum += 1;
			dfs(k + 1);
			sum -= 1;
			maze[x][y] = '.';
		}
		dfs(k + 1);		//因为可以放机关枪的点也可以选择不放,所以这里不是else 
	}
}

int main()
{
	while(true)
	{
		cin >> n;
		if(n == 0)
			break;
		for(int i = 1;i <= n;i++)
		{
			for(int j = 1;j <= n;j++)
			{
				cin >> maze[i][j];
			}
		}
		dfs(1);
		cout << max_res << endl;
		max_res = 0;
		sum = 0;
	}
	return 0;	
} 

此题只要把剪枝条件想清楚,然后把状态(即dfs函数的参数)设清楚,就很好写了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值