网课链接
看到网课是懒猫老师-C语言-递归函数-八皇后问题(搜索,回溯)
上对角线
所谓上对角线,就是指n-col(行号减去列号),但是我们再使用的时候为了方便,就通常采用(n-col+7),这样均为正数;
如下图:
这样的斜线一共有15条;
因此我们需要15个bool变量来表示每条对角线的状态
bool d1[14];,每一个bool值都代表一个对角线,哪个值为false就代表哪条线不能放置皇后
下对角线
所谓下对角线,就是指n+col(行号+列号),如下图:
这样的斜线一共有15条;
因此我们需要15个bool变量来表示每条对角线的状态
bool d2[14];,每一个bool值都代表一个对角线,哪个值为false就代表哪条线不能放置皇后
程序思路
完整C++代码
#include<iostream>
using namespace std;
/*8皇后问题*/
void gernerate(int num);
//四个公用变量数据初始化
int place[8]; //第n行皇后所占位置的行号
bool flag[8] = {1,1,1,1 ,1,1,1,1}; //col列上是否可以放皇后 ,可以放置是真,不可以是假
bool d1[14]={1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1}; //(n,col)所在上对角线上是否可以放置皇后?
bool d2[14]={1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1}; //(n,col)所在下对角线上是否可以放置皇后?
int number=0; //how many answers does the progrem have
int main(){
gernerate(0);
cout<<number<<endl;
return 0;
}
void gernerate(int n){//num is the line of queen
for(int col=0;col<8;col++) {
if(flag[col]&&d1[n-col+7]&&d2[n+col]){
place[n]=col; //放置皇后
//占领col列及上下对角线
flag[col]=false;
d1[n-col+7]=false;
d2[n+col]=false;
/*如果n小于7,那么对下一行进行递归
否则(n=7),那就是找到了一种方式来摆放
所以number++;
*/
if(n<7)
gernerate(n+1);
else
number++;
//释放col列及上下对角线
flag[col]=true;
d1[n-col+7]=true;
d2[n+col]=true;
}
}
}