ZOJ 1002

整体思路就是dfs,我觉得就是从第一个位置开始尝试放置火力点,如果可以放就继续向下深搜,搜索完毕后回溯!如果不可以就直接递归的判断下一个位置,就这样不断递归下去就能考虑到所有情况,而且还要比穷举快很多!


#include<stdio.h>
#include<stdlib.h>
#define SIZE 4

int n;
int max;

int ret(char str[][SIZE],int k);

void work(char str[][SIZE],int k,int now);

int main()
{
	scanf("%d",&n);
	getchar();
	while(n!=0)
	{
		int i,j;
		char map[SIZE][SIZE];
		max = 0;
		for(i = 0;i < n;i++)
		{
			for(j = 0;j < n;j++)
				scanf("%c",&map[i][j]);
			getchar();
		}
		work(map,0,0);
		printf("%d\n",max);
		scanf("%d",&n);
		getchar();
	}
	return 0;
}

int ret(char str[][SIZE],int k)
{
	int i,flag = 1;
	int a,b;
	a = k / n;
	b = k % n;
	for(i = a - 1;i>=0;i--)
		if(str[i][b]!='.')
		{
			if(str[i][b]=='D')                    
				flag = 0;
			break;
		}
	for(i = b - 1;i>=0;i--)
		if(str[a][i]!='.')
		{
			if(str[a][i]=='D')
				flag = 0;
			break;
		}
	return flag;

}

void work(char str[][SIZE],int k,int now)
{
	int a,b;
	a = k / n;
	b = k % n;
	max = now>max?now:max;
	if(k<n*n)
	{
		if(str[a][b]!='X'&&ret(str,k))
		{
		    str[a][b] = 'D';
		    work(str,k+1,now+1);
			str[a][b] = '.';
		}
		work(str,k+1,now);
	}
}

具体实现上,我是用二维数组储存,然后用全局变量max保存最大火力点数,不断更新就可以了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值