八皇后问题C语言解法(递归、回溯)

本算法是经过学习B站UP主讲解后,整理出来的代码,编译无误,可生成92种方式。 

#include "stdafx.h"
#include"stdlib.h"

int place[8] = {0};//用来记录当前行的皇后在第几列
bool flag[8] = {1,1,1,1,1,1,1,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;//技术总共有多少解法

void print(int n)
{
	int i,j;
	int table[8][8]={0};
	for(i=0;i<8;i++)
	table[i][place[i]]=1;
	printf_s("\n第 %d 种\n",n);
	for(i=0;i<8;i++)
	for(j=0;j<8;j++)
	{
		printf_s("%d ",table[i][j]);
		if(j==7)printf_s("\n");
	}
}

void generate(int n)
{
	int col;//当前列
	for(col=0;col<8;col++)//八列都需要判断完
	{
		if(flag[col]==1 && d1[n-col+7] == 1 && d2[n+col] == 1)//查看占领状态
		{
			//符合条件即占领
			place[n]=col;
			flag[col] = 0;
			d1[n - col + 7] = 0;
			d2[n + col] = 0;
			if(n<7)//八个皇后全部放置完毕判断
				generate(n+1);
			else
			{
				++number;
				print(number);
			}
			//所有的检查完,再继续回溯,确保得出所有解
			flag[col] = 1;
			d1[n - col + 7] = 1;
			d2[n + col] = 1;
		}
	}
}



int main()
{  
	printf_s("八皇后放法:\n");
	generate(0);
	printf_s("总共有 %d 种八皇后放法\n", number);
	system("pause");
	return 0;
}

 

你可能感兴趣的:(C语言)