7-7 n皇后

7-7 n皇后#

n皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

输入格式:#

共一行,包含整数 n (1 ≤ n ≤ 12)。

输出格式:#

给出所有可能摆放情况的种数,结尾无空格换行。

输入样例:#

在这里给出一组输入。例如:

4

输出样例:#

在这里给出相应的输出。例如:

2

简化版代码(c++)#

#include<bits/stdc++.h>

const int N = 15;
const int M = 30;

int ans, n;
bool x[N], y[M], z[M];

void dfs(int i)
{
    if (i == n) ++ans;
    for (int j = 0; j < n; ++j) {
        if (x[j] || y[N + j - i] || z[i + j]) continue;
        x[j] = y[N + j - i] = z[i + j] = true;
        dfs(i + 1);
        x[j] = y[N + j - i] = z[i + j] = false;
    }
}

int main()
{
    scanf("%d", &n);
    dfs(0);
    printf("%d", ans);
  
    return 0;
}

注释版代码(c++)#

其中x​数组表示每列是否有皇后,y​和z​数组表示主对角线和副对角线是否有皇后。

#include<bits/stdc++.h>

const int N = 15;
const int M = 30;

int ans, n;
bool x[N], y[M], z[M];

// 深度优先搜索函数
void dfs(int i)
{
    // 如果已经遍历到最后一行,递增答案计数
    if (i == n) ++ans;

    // 尝试在当前行的每一列放置皇后
    for (int j = 0; j < n; ++j) {
        // 如果当前列、主对角线、副对角线已经有皇后,则跳过
        if (x[j] || y[N + j - i] || z[i + j]) continue;

        // 放置皇后并递归到下一行
        x[j] = y[N + j - i] = z[i + j] = true;
        dfs(i + 1);

        // 恢复状态,回溯
        x[j] = y[N + j - i] = z[i + j] = false;
    }
}

int main()
{
    // 输入棋盘大小
    scanf("%d", &n);

    // 开始深度优先搜索
    dfs(0);

    // 输出答案
    printf("%d", ans);

    return 0;
}

java版代码#

import java.util.Scanner;

public class Main {
    static final int N = 15;
    static final int M = 30;
    static int ans, n;
    static boolean[] x = new boolean[N];
    static boolean[] y = new boolean[M];
    static boolean[] z = new boolean[M];

    // 深度优先搜索函数
    static void dfs(int i) {
        // 如果已经遍历到最后一行,递增答案计数
        if (i == n) ++ans;

        // 尝试在当前行的每一列放置皇后
        for (int j = 0; j < n; ++j) {
            // 如果当前列、主对角线、副对角线已经有皇后,则跳过
            if (x[j] || y[N + j - i] || z[i + j]) continue;

            // 放置皇后并递归到下一行
            x[j] = y[N + j - i] = z[i + j] = true;
            dfs(i + 1);

            // 恢复状态,回溯
            x[j] = y[N + j - i] = z[i + j] = false;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入棋盘大小
        n = scanner.nextInt();

        // 开始深度优先搜索
        dfs(0);

        // 输出答案
        System.out.println(ans);
    }
}

作者:aslwr

出处:https://www.cnblogs.com/aslwr/p/77-n-queen-z1og1et.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

各位可以多多推广哦φ(>ω<*)

posted @   qing影  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示