N皇后问题的栈实现方法

本文介绍了如何用C语言中的栈和回溯法解决经典问题N皇后问题,同时提及了问题的对称性带来的优化策略。
摘要由CSDN通过智能技术生成

题目

最近在复习数据结构的栈这块时看到的书后习题,大一初学c那会儿一直觉得N皇后问题是个很难的问题,系统的学习完数据结构再来看这道题已经有了不一样的思考方向了。

此处不在赘述n皇后问题的具体内容,直接放源码

源码

#include<stdio.h>
#include<math.h>
#define N 12
int N_Queen(int n)
{
	if (n <= 2)return -1;
	int i, j, num = 0;
	int s[100];
	int top = -1, x;
	int pass, pre, find;
	s[++top] = 0;
	while (top != -2)//不等于-2是由于回溯时第一行已经被遍历完,导致top指向-2(虽然不方便理解,但可以减少一次判断)
	{
		x = top; pre = -1;
		if (x == N - 1)
		{
			num++;
			pre = s[--top];
			--top;
			x = x - 2;
		}
		while (top!=-2)//回溯循环
		{
			find = 0;
			for (j =pre+1; j < N; j++)
			{
				pass = 1;
				for (i = top; i >= 0; i--)//筛选循环
				{
					if (j ==s[i] || abs(x + 1 - i) == abs(j - s[i]))
					{
						pass = 0;
						break;//该列与任意一个栈内的合法皇后不满足条件,就进入下一列。
					}
				}
				if (pass)//x+1行找到一个合法皇后
				{
					s[++top]=j; //将其入栈
					find = 1;
					break;
				}
			}
			if (!find)//如果x+1一整行没有找到合法皇后
			{
				pre = s[top--];//回溯
				x--;
			}
			else break;
		}
	}
	return num;
}
int main()
{
	printf("%d\n",N_Queen(N));
}

 其他

其实还有一些比较容易实现的优化,比如n皇后问题的解是左右对称的,因此我们只需要针对偶数n和奇数n设定好终止位置,将已知解的个数通过公式计算出来即可(比如偶数n皇后问题只需要求出左半边的所有解即可)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值