算法设计 || 第12题:12皇后&回溯算法(C语言代码)

之前关于8皇后更详细总结:

算法设计 || 实验四 回溯算法-八皇后问题(纯手敲保姆级详细讲解+小白适用+头歌解析)_MSY~学习日记分享的博客-CSDN博客

学习的功夫一定要在平时,这样你考试前不必慌张,不用着急,

平时注意测试和复习,考试前非常轻松,

想要做自己喜欢的事情,人人都想要放松,

但是必须完成必须完成的事情,否则你不会安心的! 

用回溯算法求解N=12皇后问题的- -个解。这里要求在试探前k
(k=你的学号后两位%3+3)个皇后的位置时不再是逐步-列列地
往后尝试,而是改做随机投放,剩下的N-k个皇后再逐个试探。编写求解该问题的C程序。

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
int *X; // 用于记录每个皇后所在的列数

int check(int k) {
    int i;
    for (i = 0; i < k; i++) {
        // 如果当前位置同一列或同一对角线上已经有皇后,返回 0
        if (X[k] == X[i] || abs(i - k) == abs(X[i] - X[k])) {
            return 0;
        }
    }   
    return 1;
}

void setQueens(int N) {
    // 前k个随机投放(check满足条件放)
    int k = 5;
    int i;
    for (i = 1; i < k; i++) {
        int num = rand() % N + 1; // 产生从1到N的随机数
        X[i] = num;
        while (!check(i)) {
            X[i] = rand() % N + 1;
        }
    }
    
    while (k > 0) {
        X[k]++;
        while (X[k] <= N && check(k)) {
            if (k == N) {
                return;
            } else {
                k++;
                break;
            }
        }
        
        // 出界,回溯
        if (X[k] > N) {
            X[k] = 0;
            k--;
        }
    }
}

int main() {
    int i;
    int N = 12;
    X = (int*)malloc(sizeof(int) * (N + 1));
    for (i = 0; i <= N; i++)
        X[i] = 0;
    
    setQueens(N);
    
    for (i = 1; i <= N; i++) {
        printf("%d ", X[i]);
    }
    
    free(X);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值