八皇后问题及其优化

1. 循环暴力解法

cint a[9], cnt;
bool check() {
   for (int i = 1; i <= 8; i++)
   		for (int j = i + 1; j <= 8; j++) {
   			if (a[j] == a[i])
   				return false;
   			else if (abs(a[j] - a[i]) == j - i)
   				return false;
   	}
   return true;
}

int main() {
   for (a[1] = 1; a[1] <= 8; a[1]++)
   		for (a[2] = 1; a[2] <= 8; a[2]++)
   			for (a[3] = 1; a[3] <= 8; a[3]++)
   				for (a[4] = 1; a[4] <= 8; a[4]++)
   					for (a[5] = 1; a[5] <= 8; a[5]++)
   						for (a[6] = 1; a[6] <= 8; a[6]++)
   							for (a[7] = 1; a[7] <= 8; a[7]++)
   								for (a[8] = 1; a[8] <= 8; a[8]++)
   									if (check()) cnt++;
   return 0;
}

2. 循环剪枝

bool check(int k){
for (int i = 1; i < k; i++){
    if (a[i] == a[k])
         return false;
    else
    if (abs(a[k] - a[i]) == k - i)           
         return false;
  }
  return true;
} 

int main(){
	for (a[1] = 1; a[1] <= 8; a[1]++)
      	for (a[2] = 1; a[2] <= 8; a[2]++)
           	if (check(2))
               	for (a[3] = 1; a[3] <= 8; a[3]++)
                   	if (check(3))
                       	for (a[4] = 1; a[4] <= 8; a[4]++)
                           	if (check(4))
                               	for (a[5] = 1; a[5] <= 8; a[5]++)
                                   	if (check(5))
                                       	for (a[6] = 1; a[6] <= 8; a[6]++)
                                            if (check(6))
                                                for (a[7] = 1; a[7] <= 8; a[7]++)
                                                    if (check(7))
                                                        for (a[8] = 1; a[8] <= 8; a[8]++)
                                                            if (check(8))
                                                                 cnt++;
 return 0;
 }

3. 深度遍历

int a[9], cnt;
bool check(int k){
    for (int i = 1; i < k; i++){
         if (a[i] == a[k]) return false;
         else if (abs(a[k] - a[i]) == k - i) return false;
    }
    return true;
}
void dfs(int k){
    if (k == 9) cnt++;
    else for (int i = 1; i <= 8; i++){
        a[k] = i;
        if (check(k))  dfs(k + 1);
    }
}

4. check O(1)优化
上图两张:
在这里插入图片描述
在这里插入图片描述

const int maxn = 10;
int  a[maxn], col[maxn], diag1[2 * maxn], diag2[2 * maxn], n, cnt;

void dfs(int k){
	if (k == n + 1)  cnt++;
	else for (int j = 1; j <= n; j++){
		a[k] = j;
		if ( !col[j] &&  !diag1[k + j - 1]  &&  !diag2[k - j + n] ){
			col[j] = diag1[k + j - 1] = diag2[k - j + n] = 1;
			dfs(k + 1);
			col[j] = diag1[k + j - 1] = diag2[k - j + n] = 0;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Researcher-Du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值