HDU2553 N皇后问题

本文介绍了一种解决经典的N皇后问题的方法,通过递归搜索和回溯算法来找出所有有效的放置方案数量。从1到10枚举N的大小,并记录每种情况下可行的解决方案数目。

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

题意:有名的N皇后问题。输入N,求符合要求的N皇后排法有几个。

思路:看注释

#include<iostream>
#include<stack> 
using namespace std;
#define MAXN 10 + 3

int list[MAXN];
int counts[MAXN];
int count = 0;
int n;

void search(int m) {
    //m表示层数,一开始从0开始search(),程序会一直回朔到第n层
    if (n == m) {
		//因为遍历是从0开始的。这里也可以写成if (n - 1 == m - 1)
        count ++;
        return;
    } 
    for (int i=0; i<n; i++) {
        bool ok = true;
        list[m] = i;
        for (int j=0; j<m; j++) {
            if (list[m] == list[j] || m + list[m] == j + list[j] || m - list[m] == j - list[j]) {
				//对于第m层的每个可能的点i,与m层之前的m-1层进行比较,如果符合规则就search() m + 1 层
                ok = false;
                break;
            }
            
        }
        if (ok) {
                search(m + 1);
        }
    }


} 

void init() {
    for (int i=1 ;i<=10; i++) {
		//打表
        n = i;
        count = 0;
        search(0);
        counts[i] = count;   
    }
}
int main() {
    init();
    while (cin>>n, n) {
        //count = 0;
        //search(0);
        cout<<counts[n]<<endl;
    
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值