You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
2.5 KiB

#include<bits/stdc++.h>
using namespace std;
//打印棋盘和皇后
void showQueens(int queenArr[], int nlen, int nSolution) {
//解法数量
cout << nSolution << endl;
for (int i = 0; i < nlen; ++i) {
//打印皇后前面的格子
for (int j = 0; j < queenArr[i]; ++j) {
cout << "1";//空格子
}
cout << "Q";//皇后
//打印皇后后面的格子
for (int z = 0; z < nlen - queenArr[i] - 1; ++z) {
cout << "1";
}
cout << endl;
}
cout << " " << endl;
}
//判断检查当前行及以前的,是不是可以行的通
bool rule(int queenArr[], int num)
{
//每一行,每一列去遍历
for (int i = 0; i <= num; ++i) {
for (int j = 0; j <= i - 1; ++j) {
//判断皇后是否在同一列,因为放时没有往同一行放,所以行不用判断了
if (queenArr[i] == queenArr[j]) {
return false;
}
//判断皇后是否在对角45°
if (abs(queenArr[i] - queenArr[j]) == abs(i - j)) {
return false;
}
}
}
return true;
}
//移动皇后
void enumQueensPositon(int queenArr[], int& nSolution) {
//第一行
for (queenArr[0] = 0; queenArr[0] < 8; ++queenArr[0]) {
//第二行
for (queenArr[1] = 0; queenArr[1] < 8; ++queenArr[1]) {
if (!rule(queenArr,1)) {
continue;
}
else {
for (queenArr[2] = 0; queenArr[2] < 8; ++queenArr[2]) {
if (!rule(queenArr,2)) {
continue;
}
else {
for (queenArr[3] = 0; queenArr[3] < 8; ++queenArr[3]) {
if (!rule(queenArr,3)) {
continue;
}
else {
for (queenArr[4] = 0; queenArr[4] < 8; ++queenArr[4]) {
if (!rule(queenArr,4)) {
continue;
}
else {
for (queenArr[5] = 0; queenArr[5] < 8; ++queenArr[5]) {
if (!rule(queenArr,5)) {
continue;
}
else {
for (queenArr[6] = 0; queenArr[6] < 8; ++queenArr[6]) {
if (!rule(queenArr,6)) {
continue;
}
else {
for (queenArr[7] = 0; queenArr[7] < 8; ++queenArr[7]) {
if (!rule(queenArr,7)) {
continue;
}
else {
++nSolution;
showQueens(queenArr, 8, nSolution);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
int main() {
//每个数组位表示一个皇后
int queenArr[8] = { };
//数组初始化
memset(queenArr, -1, sizeof(queenArr));
//解法数量
int nSolution = 0;
//开始计算
enumQueensPositon(queenArr, nSolution);
//printf("%d ",nSolution);
return 0;
}