【DFS】hdu 2553 N皇后问题

题目描述:

http://acm.hdu.edu.cn/showproblem.php?pid=2553

 

思路:

采用打表的方式来做这道题。

对于 N 皇后问题,具体解法是:从第 0 列开始,逐行放置皇后。

check() 函数用来回溯剪枝。

 

代码:

#include<bits/stdc++.h>
using namespace std;

int num[11] = {0};
int n;
int cols[11];

bool check(int r, int c){
    //检查 0 ~ r-1 行皇后的放置位置 
    for(int i=0;i<r;i++){
        //cols[i] 记录的是第 i 行皇后的位置信息 
        if(cols[i] == c || abs(r-i) == abs(c-cols[i])){
            return false;
        }
    }
    return true;
}

void dfs(int r){
    //0~n-1 行皇后放置完毕 
    if(r == n){
        num[n]++;
        return;
    }
    
    //从第 0 列开始,尝试放置皇后 
    for(int i=0;i<n;i++){
        if(check(r, i)){
            //放置皇后,记录信息
            cols[r] = i;
            //放置下一行 
            dfs(r+1);
        }
    }
}

int main(){
    for(int i=1;i<=10;i++){
        memset(cols, -1, sizeof(cols));
        n = i;
        dfs(0);
    }
    while(scanf("%d", &n) && n){
        printf("%d
", num[n]);
    }
} 

 

作者:老干妈就泡面
本文版权归作者和博客园共有,欢迎转载,但请给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/bjxqmy/p/14420200.html