八皇后,用回溯。
可以这么想象,一个八层的楼房,每一层有八个楼梯可以下去。
循环,如果这个楼梯可以下去,那么记录,并下去。
如果到了底部,那么输出。
归零。
//主要是为了测试 回溯法,所以采用简单的
#include <iostream>
using namespace std;
int a[9]={0}; // 0代表没放,1 - 9 分别代表放的位置
int all=0; //all
int abs(int h){
if (h>=0)return h;
else {return -h;}
}
bool ok(int qian,int num){ //qian 值的是这次行数,num是放的数
// 如果num 和qian的每个对应位置 有相同,则不行。
if(qian==1)return true;
bool flag= true;
for(int j=1;j<qian;j++){
if(a[j]==num)flag=false;
if(qian-j==abs(num-a[j]))flag=false;
}
return flag;
}
void queen(int i){
for(int j=1;j<=8;j++)
{
if(ok(i,j)){ //如果可以
a[i]=j; //记录 ,下楼
queen(i+1);//下楼
}
}
if (i==8 &&a[8]!=0){
for(int j=1;j<=8;j++)cout<<a[j]<<" ";
cout<<"\n";
a[0]+=1;//到底层输出。
}
a[i]=0;
}
int main(){
queen(1);
cout<<a[0];
}