ZOJ 1002 Fire Net 深度优先搜索算法

博客介绍了作者在解决ZOJ 1002 Fire Net问题时如何运用深度优先搜索算法。最初,作者通过四层嵌套循环实现了算法,虽然结果正确但无法通过系统验证。后来,作者学习了他人的解决方案,并解决了因函数重名导致的编译错误。文章主要探讨了DFS算法在实际问题中的应用。

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

这道里原来我在看别人代码之前, 也写过。 洋洋洒洒的写了一个main函数四个嵌套for循环, 第一次的大手笔运行结果没有问题, 但就是提交不上去, 还不收呢?搁置了好几天后, 没办法放弃。

后来看了一下别人的代码, 写完后提交编译错误, 都是因为跟系统函数重名缘故。

 这道题的名头是,DFS(Depth-First-Search)深度优先搜索算法

#include "iostream"
using namespace std;

#define size 5
char a[size][size];
int maxNum = 0;        //保存着最终的个数

/*
checkA这个函数是检验当前位置可否放置blockhouses 
*/
bool checkA(int row, int col){
	int i, j;
	if( a[row][col] == 'X' )
		return false;
	for( i = row ; i >= 0; i-- ){
		if( a[i][col] == 'X' )
			break;
		if( a[i][col] == 'A')
			return false;
	}
	for( j = col ; j >= 0; j-- ){
		if( a[row][j] == 'X' )
			break;
		if( a[row][j] == 'A')
			return false;
	}
	return true;
}

void appendA(int n, int k, int num){
	//当遍历到最后时, 返回
	if(k == n * n){
		if( num > maxNum )
			maxNum = num;
		return;
	}
	int i = k / n;
	int j = k % n;
	if( checkA( i, j ) ){
		a[i][j] = 'A';				//在a[i][j]处放置一个blockhouses , 并把这儿标记为A
		appendA(n, k+1, num+1);	    //放置blockhouses后进入下层递归
		a[i][j] = '.';              //可能该位置不放置blockhouses的情况可得出最优解
	}
	appendA(n, k+1, num);			//不放置blockhouses后进入下层递归
}

int main(){
	int n;
	while( cin >> n && n ){
		maxNum = 0;
		int i, j;
		for(i = 0; i < n; i++){
			for(j = 0; j < n; j++){
				cin>>a[i][j];
			}
		}
		appendA(n, 0, 0);     //数组大小是n*n, 我们从(0,0)开始进行运算, 第三个参数是num, 累计个数
		cout<<maxNum<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值