8 皇后问题
#ifndef ALG_8QUEEN_H__
#define ALG_8QUEEN_H__
#include <stdio.h>
#include <string.h>
namespace alg {
class Queen8 {
private:
char board[8][8];
int cnt; // 记录正确的结果数
public:
void solve() {
// 主函数
_solve(0);
}
Queen8() {
memset(board, '0', sizeof(board));
cnt = 0;
}
private:
bool check(int row, int col) {
// 检查位置是否合适
int i, j;
// 检查该列是否以及有其他皇后
for (i = 0; i < row; i++) {
if (board[i][col] == '1') {
return false;
}
}
// 检查对角线
i = row - 1, j = col - 1;
while (i >= 0 && j >= 0) {
if (board[i][j] == '1') {
return false;
}
i--;
j--;
}
i = row - 1, j = col + 1;
while (i >= 0 && j < 8) {
if (board[i][j] == '1') {
return false;
}
i--;
j++;
}
return true;
}
void print() {
// 打印结果
printf("chessboard: %d\n", ++cnt);
int i, j;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void _solve(int row) {
for (int i = 0; i < 8; ++i) {
board[row][i] = '1';
if (check(row, i)) {
if (row == 7)
print();
else
_solve(row+1);
}
// 回溯
board[row][i] = '0';
}
}
};
}
#endif
检验:
#include "8queen.h"
int main(void) {
alg::Queen8 q;
q.solve();
return 0;
}