回溯法 - 递归 - n皇后问题 - 所有解

伪代码
在这里插入图片描述
在这里插入图片描述

代码如下

//回溯法 - 递归 - n皇后问题 - 所有解
//编译器:vs 2019
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

int n = 0;					//n皇后的n
int x[80] = {
    
     0 };			//存放解空间
int cnt = 0;				//解个数

bool place(int k)
{
    
    
	//判断第k行皇后和第k-1行皇后是否有冲突,有冲突则返回false,没有冲突则返回true
	for(int i = 1; i < k; i++)
	{
    
    
		if (x[i] == x[k] || abs(i - k) == abs(x[i]-x[k]))
			return false;
	}
	return true;
}

void output(int num[])
{
    
    
	for (int i = 1; i <= n; i++)
		printf("%d ",num[i]);
	printf("\n");
}

bool nqueen(int k)
{
    
    
//	printf("进入nqueen\n");
	//在前k-1行已放置k-1互不攻击的皇后的情况下,求解n皇后问题并输出所有解
	bool t = false;				//先初始化标记

	for (int i = 1; i <= n; i++)	
	{
    
    
		x[k] = i;				//尝试将n皇后放在第i列

		if (place(k))			//如果第k行的当前位置可放置皇后
		{
    
    
			if (k == n)
			{
    
    
				t = true;
				output(x);
				cnt++;
			}
			else				//是部分解
			{
    
    
				bool t1 = nqueen(k + 1);		//递归调用
				if (t1)  t = true;
			}
		}
	}
	return t;
}

int main( )
{
    
    
	
	scanf("%d",&n);
	bool flag = nqueen(1);

	if ( cnt )
		printf("共%d个解",cnt);

	if (flag == false)
		printf("no solution !\n");

	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51336041/article/details/121889144