题解 | #八皇后#

八皇后

https://www.nowcoder.com/practice/fbf428ecb0574236a2a0295e1fa854cb

#include <stdio.h>

#include <stdlib.h>

int pos[8];//记录每行皇后的位置

int sum = 0;//记录解的个数

int f(int in, int j) {//in为当前行,j为当前列,判断当前位置是否与前in行的皇后冲突

    for (int i = 0; i < in; i++) {

        //for(int k=0;k<8;k++)

        if (abs(i - in) == abs(pos[i] - j) || j == pos[i]) {//判断是否同在一条斜线,或同在一条竖线

            return 0;

        }

    }

    return 1;

}

void dfs(int index, int n) {

    if (index == 8) {//棋盘8行均放好皇后

        sum++;//统计解的个数

        if (sum == n) {//第n个解时输出答案

            for (int p = 0; p < 8; p++) {

                printf("%d", pos[p] + 1);

            }

            printf("\n");

        }

    }

    for (int j = 0; j < 8; j++) {//在当前行,遍历每一列的位置,看是否可以放置皇后

        pos[index] = j;

        if (f(index, j)) {

            dfs(index + 1, n);//递归,判断下一行

        }

    }

}

int main() {

    int n;

    while (scanf("%d", &n) != EOF) { // 注意 while 处理多个 case

        // 64 位输出请用 printf("%lld") to

        dfs(0, n);

        sum = 0;

        //printf("%d\n",sum);

    }

    return 0;

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务