八皇后问题-使用递归回溯方法用c语言实现

这篇文章介绍了如何使用C语言通过递归和回溯法解决八皇后问题,展示了如何检查皇后在棋盘上的位置冲突,并逐步生成所有可能的解。
摘要由CSDN通过智能技术生成

学习的视频:懒猫老师

https://www.bilibili.com/video/BV1wJ411U7Gy/?spm_id_from=333.337.search-card.all.click&vd_source=da60f9e1bc3321cae28c29fe80e9b078






 

代码:

编译:gcc test.c -g

#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;
}

//打印结果,第n个皇后所占位置的列号
void print()//定义输出函数
{
	int col,i,j;
	number++;//每调用一次输出函数number自加一次,记录摆放方法个数
	printf("No.%2d\n",number);
	int table[8][8]={0};//设置一个8*8的棋盘
	for (i=0;i<8;i++)
	{
		table[i][place[i]]=1;//将每一行皇后所在位置赋值为1
	}
	for (i=0;i<8;i++)
	{
		for (j=0;j<8;j++)
		{
			printf("%d ",table[i][j]);
		}
		printf("\n");
	}
}

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;			//在n行coL列摆放皇后
			flag[col] = false;		//宣布占领第coL列
			d1[n-col+7] = false;	//占领两个对角线
			d2[n+col] = false;

			if(n < 7)				//8个皇后没有摆完,递归摆放下一行里面的皇后
				gernerate(n+1);
			else
				print();			//N=7,皇后都放完了,打印结果
			
			//回溯:考虑其它的可行方案
			flag[col] = true;
			d1[n-col+7] = true;
			d2[n+col] = true;
        }
    }
}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值