八皇后问题
在n*n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
输入: n的大小,即棋盘的大小
输出:棋盘(用1表示皇后.0表示空着的棋盘)
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<stdbool.h>
#define max_board 30
using namespace std;
int board_size;
int queen[max_board][max_board];//构造的棋盘
int count=0;
int sum;
//皇后初始化
void initialize() {
int row,col;
for(row=0; row<board_size; row++)
for(col=0; col<board_size; col++)
queen[row][col]=0;
}
//打印皇后棋盘
void print() {
int i,j;
for(i=0; i<board_size; ++i) {
for(j=0; j<board_size; ++j) {
printf(" %d",queen[i][j]);
}
printf("\n");
}
printf("\n\n");
}
//判断皇后是否设防
bool unguarded(int line,int col) {
int i;
for(i=0; i<line; ++i)
if(queen[i][col]==1)
return false;
for(i=1; line-i>=0&&col-i>=0; i++)
if(queen[line-i][col-i]==1)
return false;
for(i=1; line-i>=0&&col+i<board_size; i++)
if(queen[line-i][col+i]==1)
return false;
return true;
}
void insert(int m,int n) {
queen[m][n]=1;
++count;
}
void remove(int m,int n) {
queen[m][n]=0;
--count;
}
//回溯函数
void solve_from(int line,int col) {
if(count==board_size) {
print();
++sum;
} else {
int i;
for(i=0; i<board_size; ++i) {
if(unguarded(line,i)) {
//queen[line][i]=1;
//++count;
insert(line,i);
solve_from(line+1,0);
//queen[line][i]=0;
//--count;
remove(line,i);
}
}
}
}
int main() {
printf("This is the Queens game.\nWhat is the size of the board?\n");
scanf("%d",&board_size);
while(board_size>=0) {
if(board_size<0||board_size>max_board)
printf("The number must be between 0 and %d.\n\n",max_board);
else {
initialize();
solve_from(0,0);
}
printf("This is the Queens game.\nWhat is the size of the board?\n");
scanf("%d",&board_size);
}
}