在棋盘上放置8个皇后,使得它们互不攻击,此时每个皇后的攻击范围为同行同列和同
对角线,要求找出所有解
#include<iostream>
using namespace std;
int s[10][10];
int t=0;
bool get(int hang,int lie,int &h,int &l){
for(int i=lie+1;i<=8;i++){
if(s[hang][i] == 0){
h = hang;
l = i;
return true;
}
}
for(int j=hang+1;j<=8;j++){
for(int k=1;k<=8;k++){
if(s[j][k] == 0){
h = j;
l = k;
return true;
}
}
}
return false;
}
void flect(int hang,int lie){
//将所有<=0的受影响位置减1
for(int i=hang-1, j=lie-1;i>=1 && j>=1;i--,j--){
if(s[i][j] <= 0) s[i][j]--;
}
for(int i=hang+1, j=lie+1;i<=8 && j<=8;i++,j++){
if(s[i][j] <= 0) s[i][j]--;
}
for(int i=hang-1, j=lie+1;i>=1 && j<=8;i--,j++){
if(s[i][j] <= 0) s[i][j]--;
}
for(int i=hang+1, j=lie-1;i<=8 && j>=1;i++,j--){
if(s[i][j] <= 0) s[i][j]--;
}
for(int i=1;i<=8;i++){
if(s[hang][i] <=0) s[hang][i]--;
}
for(int i=1;i<=8;i++){
if(s[i][lie] <=0) s[i][lie]--;
}
}
void deflect(int hang,int lie){
//将所有受影响的<0的位置加1
for(int i=hang-1, j=lie-1;i>=1 && j>=1;i--,j--){
if(s[i][j] < 0) s[i][j]++;
}
for(int i=hang+1, j=lie+1;i<=8 && j<=8;i++,j++){
if(s[i][j] < 0) s[i][j]++;
}
for(int i=hang-1, j=lie+1;i>=1 && j<=8;i--,j++){
if(s[i][j] < 0) s[i][j]++;
}
for(int i=hang+1, j=lie-1;i<=8 && j>=1;i++,j--){
if(s[i][j] < 0) s[i][j]++;
}
for(int i=1;i<=8;i++){
if(s[hang][i] <0) s[hang][i]++;
}
for(int i=1;i<=8;i++){
if(s[i][lie] <0) s[i][lie]++;
}
}
void print(){
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(s[i][j] > 0){
cout << "+";
}else{
cout << "口";
}
}
cout <<"\n";
}
cout <<"\n";
}
void write(int a,int hang,int lie){
if(a==9){
print();
t++;
return;
}
int h;
int l;
while(get(hang,lie,h,l)){
s[h][l] = a;
flect(h,l);
write(a+1,h,l);
s[h][l] = 0;
deflect(h,l);
hang=h;
lie=l;
}
}
int main(){
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
s[i][j] = 0;//初始化为零
}
}
write(1,1,0);
cout <<t;
}
共92个解。八皇后问题的核心是回溯法,在递归的过程中回溯。