N-Queens II

按照 I 中的做法只是把返回结果变了一下,提交出现超时,这有点意思。想了想,也不能不递归呀,于是做了一些优化,既是在每次求下一值之前(即进行递归之前)先判断当前的布局是否合理,这样就能大大减少递归的次数,以十次为例,这样的提升一下子就能感觉到。

bool isvalidEachLine(int *arr,int n,int j)
{
	for (int i=0;i<j;i++)
	{
		if (j-i == abs(arr[j]-arr[i]))
		{
			return false;
		}
	}
	return true;
}
bool isPut(int *arr,int n,int i,int value)
{
	for (int j=0;j<i;j++)
	{
		if (arr[j]==value)
		{
			return false;
		}
	}
	return true;
}
void onesolu(int *arr,int n,int i,int &ret)//
{
	if (i==n)//if (i==n&&isvalid(arr,n))
	{
		ret++;
		return ;
	}
	for (int j=0;j<n;j++)
	{
		if (isPut(arr,n,i,j))
		{
			arr[i] = j;
			if (isvalidEachLine(arr,n,i))
			{
				onesolu(arr,n,i+1,ret);
			}
		}
	}
}
int totalNQueens(int n) {
	int ret=0;
	int *arr = new int[n];
	onesolu(arr,n,0,ret);//	onesolu(arr,n,0);
	delete[] arr;
	return ret;
}
这提醒了我,第一题没提交过去是不是也是超时,于是改后提交又提交了一次,果真,这次通了。好一个回马枪,呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值