一直以为八皇后的问题是一个超级复杂的题目,可是这两天好好看了下递归、回溯的问题,发现其实实现起来还是比较容易的。所以,与大家分享一下。
代码:
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
int ans = 0;
int f[8]; //f[i]表示,第i+1行皇后的位置
void print(){
int i, j;
for(i=0; i<8; i++){
for(j=0; j<8; ++j){
if(f[i] == j) printf("1");
else printf("0");
printf(" ");
}
printf("\n");
}
printf("\n");
}
int EightQueen(int row){
if(row >= 8){ //如果成功,ans++,打印八皇后图
ans++;
print();return 0;
}
else{int i, j;
for(i=0; i<8; ++i){
f[row] = i;
int flag = 1;
for(j=0; j<row; ++j){
if(f[j] == f[row] || f[j]-j == f[row]-row || f[j]+j == f[row]+row){
//如果存在危险,标志为0,继续找
flag = 0;
break;
}
}
if(flag){ //如果本行没有危险,就向下一行寻找
EightQueen(row+1);
}
}
}
return 0;
}
int main(){
EightQueen(0);
cout << "一共多少种方法:" << ans << endl;
return 0;
}
同样,根据八皇后的解法,也可以推出n皇后的方法(n<=11),因为方法是递归,所以不宜很多层。
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
int ans = 0, n;
int f[15]; //f[i]表示,第i+1行皇后的位置
void print(){
int i, j;
for(i=0; i<n; i++){
for(j=0; j<n; ++j){
if(f[i] == j) printf("1");
else printf("0");
printf(" ");
}
printf("\n");
}
printf("\n");
}
int EightQueen(int row){
if(row >= n){ //如果成功,ans++,打印n皇后图
ans++;
print();return 0;
}
else{int i, j;
for(i=0; i<n; ++i){
f[row] = i;
int flag = 1;
for(j=0; j<row; ++j){
if(f[j] == f[row] || f[j]-j == f[row]-row || f[j]+j == f[row]+row){
//如果存在危险,标志为0,继续找
flag = 0;
break;
}
}
if(flag){ //如果本行没有危险,就向下一行寻找
EightQueen(row+1);
}
}
}
return 0;
}
int main(){
while(~scanf("%d", &n)){
EightQueen(0);
cout << "一共多少种方法:" << ans << endl;
}
return 0;
}