解法来自严蔚敏的数据结构与算法。
代码如下:
#include <iostream>
using namespace std;
const int N = 8;//皇后数
int count = 0;//解法统计
int a[N][N];//储存值的数组
const char *YES = "■";
const char *NO = "□";
//const char *YES = "●";
//const char *NO = "○";
//打印一个结果。
void printOneResult(){
cout<<"------------第"<<count<<"种----------"<<endl;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(a[i][j] == 1){
cout<<YES<<" ";
}else{
cout<<NO<<" ";
}
}
cout<<endl;
}
cout<<"-----------end-------------"<<endl;
}
//放棋子
void put(int i, int j){
a[i][j] = 1;
}
//拿走棋子
void remove(int i, int j){
a[i][j] = 0;
}
//参数是否合法
bool isParameterValid(int parameter){
if(parameter < 0 || parameter > N - 1)
return false;
return true;
}
//判断,本次放的棋子是否符合题目要求。
bool isValid(int i, int j){
if(a[i][j] != 1 || !isParameterValid(i) || !isParameterValid(j)){
cout<<"isValid中,传入参数错误!"<<endl;
return false;
}
for(int k = 1; k <= i ; k++){
if (isParameterValid(i - k) && (
(a[i - k][j] != 0) ||
(isParameterValid(j - k) && a[i - k][j - k] != 0) ||
(isParameterValid(j + k) && a[i - k][j + k] != 0)
)
){
return false;
}
}
return true;
}
//递归函数。
void Trial(int i, int n){//i表示第i行,n表示最大行数。
if(i > n){//i > n表示,找到了一个正确结果。:)
count++;
printOneResult();
}else{
for(int j = 0; j <= n; j++){//走到这里说明。前i-1行都已经是正确的放法了,这次尝试第i行。
put(i, j);//第i行第j个也就是a[i][j]放上棋子
if(isValid(i, j)){//棋子合法
Trial(i + 1, n);//进行下一个判断。
}
remove(i, j);//不管棋子合法不合法,这一位都已经尝试过了所有可能,所以remove掉,开始第j + 1的循环。
}
}
}
int main(){
Trial(0, 7);
return 0;
}
这个好像不算长。思路也还算清晰,这应该是最容易想到的八皇后解法了吧。