八皇后问题递归回溯法

穿精又带淫゛_ 提交于 2020-02-06 02:53:03

写在前面:最开始接触是数据结构老师在提到过,后来在学python时老师也有提到过,出于好奇就去思考了这个问题,当然,小白的我还是在B站懒猫老师的帮助下学会啦,真棒哈哈哈哈哈哈
这里主要问题是在于判断对角线上是否能放,表示上对角线d1[],表示下对角线d2[],根据老师所说加上自己的理解,同一个下对角线上 n-col+7相同(n表示行,col表示列)
同一个对角线
同理,上对角线上n+col 相同
在这里插入图片描述
由以上可得判断的标准为(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<stdio.h>
#include <stdbool.h>
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");
	}
	 
}


运行结果:
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!