[编程题]: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皇后问题的有一个变种,在皇后问题中又加入了车、相。相只能斜着走。相当于在原来棋盘中的判定规则中做了一些改变,对不同的棋子采用不同的判定规则。