[编程题]:N皇后问题及其变种

[编程题]:N皇后问题及其变种

N皇后问题是一种常见的算法题,在LeetCode等OJ平台以及面试题中经常出现。本文总结了常见的N皇后问题和它的变种问题。

N皇后问题

国际象棋中皇后杀伤力最大,可以横、竖、斜走,因此不能用两个皇后在同一行、列、斜线上。

LeetCode 51
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.

Example:

Input: 4
Output: [
[".Q…", // Solution 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // Solution 2
“Q…”,
“…Q”,
“.Q…”]
]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.

C++

#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

void nQueens(int n);

void nQueensCore(int n, int index, int* pos);

bool check(int n, int row, int col, int pos[]);

void nQueens(int n) {
    int* pos = new int[n];
    for (int i = 0; i < n; i++) pos[i] = -1;
    nQueensCore(n, 0, pos);
}

void nQueensCore(int n, int index, int* pos) {
    if (index == n) {
        printf("\n");
        for (int i = 0; i < n; i++) {
            int col = pos[i];
            for (int j = 0; j < n; j++) {
                if (j == col) printf("Q");
                else printf(".");
            }
            printf("\n");
        }
    } else {
        for (int col = 0; col < n; col++) {
            if (check(n, index, col, pos)) {
                pos[col] = index;
                nQueensCore(n, index + 1, pos);
                pos[col] = -1;
            }
        }
    }
}

bool check(int n, int row, int col, int pos[]) {
    if (pos[col] != -1) return false;
    for (int i = 0; i < n; i++) {
        if (pos[i] == -1) continue;
        if (abs(pos[i] - row) == abs(i - col)) return false;
    }
    return true;
}

int main() {
    int n = 4;
    nQueens(n);

    return 0;
}

LeetCode 52

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Example:

Input: 4
Output: 2
Explanation: There are two distinct solutions to the 4-queens puzzle as shown below.
[
[".Q…", // Solution 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // Solution 2
“Q…”,
“…Q”,
“.Q…”]
]

N车问题

是N皇后问题的变种。车只能走横、竖两个方向,因此要保证在同一行、竖上只能有一个车。

N皇后、N车、N相问题

是N皇后问题的有一个变种,在皇后问题中又加入了车、相。相只能斜着走。相当于在原来棋盘中的判定规则中做了一些改变,对不同的棋子采用不同的判定规则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值