首页 > 技术文章 > n皇后

DDiamondd 2019-04-21 11:16 原文

 

104.N皇后 (15分)
C时间限制:1 毫秒 | C内存限制:3000 Kb
题目内容:
国际象棋中的皇后可以沿着水平线,垂直线,或者斜线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的
放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。
该题要求N皇后的放置结果共有多少种
输入描述
输入一个正整数N(N小于16)

输出描述
输出结果

输入样例
8

输出样例
92

#include <stdio.h>
#include <string.h>
int c[20];//用来记录 a[i] = j 表示第i个皇后放在了 第 j 列
int count, n;
void search(int pos){
    if(pos == n+1){
        count++;
        return ;
    }
    //看放在第几列
    for(int i = 1; i <= n; i++){
        c[pos] = i;  //把第 pos 个皇后放在了第 i 列 
        //看看和前面的皇后是否有冲突
        bool flag = true;
        for(int j = 1; j < pos; j++){
            if(c[pos]==c[j] || pos-j==c[pos]-c[j] || pos-j == c[j]-c[pos]){
                flag = false;
                break;
            }
        } 
        if(flag) search(pos+1);
    } 
} 
int main(){
    memset(c, 0, sizeof c);
    count = 0;
    scanf("%d", &n);
    search(1);  //从第 1 行开始放第一个皇后 
    printf("%d\n", count);
    return 0;
}

 

推荐阅读