八皇后问题:要在国际象棋棋盘种放置8个皇后,使得任意两个皇后都不能互相吃。(皇后可以吃同一行、同一列、同一对角线的任意棋子。)
问题的关键在于判断某个皇后所在行所在列有无别的皇后,因此行号相同、列号相同、行列号之和相同、行列号之差相同四种情况都为不满足条件,然后依照矩阵解答即可。
解答代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<cstdlib>
using namespace std;
int search(int);
int print();
bool b[9]={0},c[17]={0},d[17]={0};//b为列,c和d为对角线
int sum=0,a[9];
int search(int);
int print();
int main(){
search(1);//从第一个皇后开始放
}
int search(int i){
for(int j=1;j<=8;j++){//每个皇后都有8列可以放,i为皇后序号
if((!b[j])&&(!c[i+j])&&(!d[i+7-j])){//理解为i为行,j为列,此为判断是否可以放置皇后,而且C++不能操作负数因此要加7
a[i]=j;//放置皇后
b[j]=1;
c[i+j]=1;
d[i+7-j]=1;
if(i==8) print();//8个皇后都放置好后输出
else search(i+1);
b[j]=0;
c[i+j]=0;
d[i+1-j]=0;//回溯一步,即当前皇后退出
}
}
}
int print(){
int i;
sum++;//方案数目
cout<<"sum="<<sum<<endl;
for(i=1;i<=8;i++)cout<<a[i]<<endl;
cout<<endl;
}