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