八皇后问题---递归回溯法

写在前面:最开始接触是数据结构老师在提到过,后来在学python时老师也有提到过,出于好奇就去思考了这个问题,当然,小白的我还是在B站懒猫老师的帮助下学会啦,真棒哈哈哈哈哈哈
这里主要问题是在于判断对角线上是否能放,表示上对角线d1[],表示下对角线d2[],根据老师所说加上自己的理解,同一个下对角线上 n-col+7相同(n表示行,col表示列)
八皇后问题---递归回溯法_第1张图片
同理,上对角线上n+col 相同
八皇后问题---递归回溯法_第2张图片
由以上可得判断的标准为(flag[col]&&d1[n-col+7]&&d2[n+col]==ture),只要符合这个就能判断是否能放入棋子
place[n]=col;//摆放皇后
flag[col]=false;//宣布占领第col列
d1[n-col+7]=false;//占领上对角线
d2[n+col]=false;//占领下对角线

#include
#include 
int place[8]={0}; //第n个皇后所占位置的列号
bool flag[8]={1,1,1,1,1,1,1,1}; //标志数组,表示第col列是否可占,1表示不冲突
bool d1[15]={1,1,1,1.1,1.1,1,1,1,1,1,1,1,1};
bool d2[15]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //表示下对角线是否可占
int number = 0; //用于统计解的数量(八皇后总共有92个解)
void print();
void gernerate(int n);
int main(){
	gernerate(0);
	return 0;
}
void gernerate(int n){
	int col;
	for(col=0;col<8;col++)//每个皇后都有8种可能的列
	{
		if(flag[col]&&d1[n-col+7]&&d2[n+col])
		{
			place[n]=col;//摆放皇后 
			flag[col]=false;//宣布占领第col列 
			d1[n-col+7]=false;//占领上对角线 
			d2[n+col]=false;//占领下对角线 
			if(n<7)
				gernerate(n+1);
			else
				print();//N=7,皇后都放完了,打印结果
			
			//回溯,考虑其它的可行方案
			flag[col]=true; 
			d1[n-col+7]=true;
			d2[n+col]=true;
		}
	}	
}
void print(){
//打印结果, 第n个皇后所占位置的列号
	 int col,i,j;
	 number++;
	 printf("No. %d\n", number);
	 int table[8][8]={0};
	 for(col=0;col<8;col++)
	 	table[col][place[col]]=1;
	for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			printf("%d ",table[j][i]);
		}
		printf("\n");
	}
	 
}


运行结果:
八皇后问题---递归回溯法_第3张图片

你可能感兴趣的:(数据结构)