首页 > 其他分享 >7-7 n皇后

7-7 n皇后

时间:2023-12-23 22:34:28浏览次数:19  
标签:int dfs ++ static ans 皇后

7-7 n皇后

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

输入格式:

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

输出格式:

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

输入样例:

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

4

输出样例:

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

2

简化版代码

#include <iostream>

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;
}

注释版代码

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

#include <iostream>

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);
    }
}

标签:int,dfs,++,static,ans,皇后
From: https://www.cnblogs.com/aslwr/p/77-n-queen-z1og1et.html

相关文章

  • python回溯法n皇后问题
    classSolution:defsolveNQueens(self,n:int):defgenerateBoard():board=list()foriinrange(n):row[queens[i]]="Q"board.append("".join(row))......
  • n皇后问题
    N皇后问题是指在n*n的棋盘上要摆n个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数n,返回n皇后的摆法数。数据范围:1≤ n ≤9#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=20;intn;......
  • AcWing 842. 排列数字 && AcWing 843. n-皇后问题
    842.排列数字(全排列)题面:给定一个整数\(n\),将数字\(1∼n\)排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。#include<iostream>usingnamespacestd;constintN=10;intpath[N];//保存序列boolst[N];//数字是否被用过,bool类型的全局变......
  • 去重N皇后
    题目:将上下对称、左右对称棋局、主副对角线对称棋局和旋转后重复视为重复,则要求输出去重后的N皇后问题的棋盘布局这道题是一道作业题,我都惊到了,一向弱智的作业题中竟然冒出一道这样的题,这题最起码橙黄之间的难度,标个黄应该也没什么问题。我竟然写了一百多行代码,在不影响可读性的......
  • N皇后非递归解法
    #include<iostream>#include<cmath>usingnamespacestd;#defineN8intq[N+1];intcheck(inthang){ //该方法判断hang所在列是否合法 for(inti=1;i<hang;i++){ if(q[hang]==q[i]||abs(hang-i)==abs(q[hang]-q[i])){ return0; } } return1;}//N皇后的非递归解法voidqu......
  • 递归求解N皇后问题
      ......
  • 非递归求解N皇后问题
      ......
  • 8皇后问题用基本数据结构实现(不用stl)
    1#include<iostream>2usingnamespacestd;34#defineSTACKSIZE25656intResult;//记录结果78typedefstruct9{10introw;11intcol;12}QueenPlace;1314typedefstruct15{16QueenPlace*pBase;17......
  • N-皇后问题
    n−皇后问题是指将n个皇后放在n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表......
  • 递归求解n皇后问题
    ​ 一、问题描述        在n×n的方格棋盘上放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。下图所示为6皇后问题的一个解。二、问题求解    采用整数q[N]来存放每一个皇后所在的列号,即第i个皇后在(i,q[i])位置上,count_1表示n皇后解的个数。在n皇后......