HDOJ 1045 Fire Net

本文通过一个实战案例详细介绍了如何使用深度优先搜索(DFS)算法解决放置碉堡的问题,并提供了完整的C++代码实现。作者分享了自己在解决问题过程中的思考与挑战。

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

题目链接


这道题目不难,应该说蛮简单的。


可是我却做了一晚上。。还是最后不行参照别人的代码的。看来距离大神的距离不是一般的长啊。


思路:

用DFS遍历,看来DFS基本功还是太不扎实了。

代码及解释如下:

<span style="font-size:18px;">#include <iostream>
using namespace std;
char s[10][10];//用*表示放置碉堡
int maxnumber, n;
bool judge(int x, int y)//判断是否可以再放置
{
	for (int i = x - 1; i >= 1; i--){
		if (s[i][y] == 'X')
			break;
		if (s[i][y] == '*')
			return false;
	}
	for (int j = y - 1; j >= 1; j--){
		if (s[x][j] == 'X')
			break;
		if (s[x][j] == '*')
			return false;
	}
	return true;
}
void dfs(int x, int y, int number)
{
	if (x == n&&y == n)
	{
		if (s[x][y] == '.'&&judge(x, y))
			number++;
		if (maxnumber < number)
			maxnumber = number;
		return;
	}
	//若为X或者不可放置则进行递归且number不变
	if (!judge(x, y) || s[x][y] == 'X')
	{
		if (x < n)
			dfs(x + 1, y, number);
		else
			dfs(1, y + 1, number);  //若x已经等于N了,则置为1重新查询
	}
	else{
		s[x][y] = '*';//放置
		if (x < n)
			dfs(x + 1, y, number + 1);
		else
			dfs(1, y + 1, number + 1);

		//回溯
		s[x][y] = '.';//将标记放回
		if (x < n)
			dfs(x + 1, y, number);
		else
			dfs(1, y + 1, number);
	}
	return;
}
int main()
{
	while (cin >> n&&n)
	{
		maxnumber = 0;
		for (int i = 1; i <= n; i++) //从1开始计算
		for (int j = 1; j <= n; j++)
			cin >> s[i][j];
		dfs(1, 1, 0);
		cout << maxnumber << endl;
	}
	return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值