N皇后问题(递归与非递归解法)

最近算法老师讲到了N皇后问题,我顺便在这边总结一下他的思路,主要还是深搜加剪枝.

解题思路:用数组c存储每个皇后在下标行中的位置(即列),然后进行深搜加剪枝判断,如果不符合条件了,则回朔.思路很简单,下面的代码包含两种解法.

#include <stdio.h>
#include <stdbool.h>
#define M 8   //修改此处改变皇后的基数
bool check(int *c,int addr);
void q(int k);
void display(int *c,int n);
void qt(int k);

int c[20]={0};
int main(void)
{
	qt(1);  //非递归
	printf("\n");
	qt(1);  //递归
	return 0;
}

bool check(int *c,int k)
{
	int i=0;
	for(i = k-1;i>=1;i--)
	{
		if(c[i]==c[k]||(c[i]-c[k]==i-k)||(c[i]+i==c[k]+k)) return false;
	}
	return true;
}

void display(int *c,int n)
{
	int i=0,j=0;
	for(i=1;i<=n;i++)
		printf("%d  ",c[i]);
	printf("\n");
}
//递归解法
void q(int k)   //k代表深度
{
	int i=0;
	for(i=1;i<=M;i++)
	{
		c[k] = i;
		if(check(c,k))  //判断当前皇后放置位置是否合理
		{
			
			if(k==M)  //到达最后一层,输出
			{
				display(c,k);
			}
			else
			{
				q(k+1);  //向下搜索
			}
		}
		c[k] = 0;
	}
}
//非递归解法
void qt(int k)   //k代表深度
{
	while(k>=1)   //k=1为第一层
	{
		while(c[k]<M) //搜索一层
		{
			c[k]++;
			if(check(c,k))  //判断当前皇后放置位置是否合理
			{
				if(k==M)  //到达最后一层,输出
				{
					display(c,k);
				}
				else
				{
					k++;  //向下搜索
				}
			}
		}
		c[k] = 0;  //向上回朔,c[k]要初始化,防止数据污染
		k--;  //向上
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要出家当道士

打赏是不可能,这辈子都不可能

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值