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.

63 lines
1.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include<bits/stdc++.h>
using namespace std;
int const n=8;
//几种方案
int nSolution=0;
int queenArr[n];
//打印棋盘和皇后
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;
}
/*cur代表填数的当前行*/
void search(int cur) {
//当cur等于行数那么就代表摆放成功
if(cur == n) {
//输出
nSolution++;
//打印棋谱
showQueens(queenArr ,8, nSolution);
} else {
for(int i=0; i<n; i++) {
int ok = 1;
//尝试把第cur行的皇后放入第i列
queenArr[cur] = i;
for(int j=0; j<cur; j++) {
//判断是否同列同主对角线和同副对角线
if(queenArr[cur]==queenArr[j]||cur-queenArr[cur]==j-queenArr[j]||cur+queenArr[cur]==j+queenArr[j]) {
ok = 0;
//如果是,则不递归并退循环,回溯
break;
}
}
if(ok) {
search(cur+1); //如果合法,则递归
}
}
}
}
int main() {
//数组下标是从零开始的,即0就是第一行
search(0);
return 0;
}