基于C语言的n皇后问题

Posted Mr.zhou_Zxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于C语言的n皇后问题相关的知识,希望对你有一定的参考价值。

/*
1.利用回溯法解决N皇后问题,逐行和逐列查找满足条件的位置
2.如果一整行都找不到满足条件的位置,那么回溯到上一行
3.解决N皇后问题,就是建立N*N的矩阵,但是N皇后超过20对电脑要求比较高
4.N皇后问题中,需要满足三个约束条件,不在同一行、同一列、同一斜线
5.当N=2,3时都受到约束条件的限制
6.在queens函数中调用dispasoulution(n);函数,实现输出解功能。place(k);函数实现确定皇后放置位置问题
7.在主函数中,用户从键盘输入n值,通过判断用户输入值的可行性,给出合理建议。
*/

#include<stdio.h>
#include<stdlib.h>
const int MAXN=20;//表示最多存放的皇后个数 
int q[MAXN];//利用q[MAXN]来记录执行的列数 
void dispasoulution(int n)//输出一个解 
{
	static int count=0;//定义静态变量来统计解的个数 
	int i;
	printf("第%d个解:",++count);//每输出一次执行一次++ 
	for(i=1;i<=n;i++)
		printf("(%d,%d)",i,q[i]);//利用for循环依次输出解 
	printf("\\n");
}
int place(int k)//调用place函数判断能否放置该皇后 
{
	int i=1;
	while(i<k)
	{
		if((q[i]==q[k])||(abs(q[i]-q[k])==abs(i-k)))//判断是否满足约束关系,不能同列,不能同对角线 
		return 0;
		i++;
	}
	return 1;
}
void queens(int n)
{
	int k=1;//表示皇后个数或行数 
	q[k]=0;//表示当前列,从开头存放 
	while(1)
	{
		q[k]=q[k]+1;//测试下一列 
		while(q[k]<=n&&!place(k)) 
			q[k]=q[k]+1;
		if(q[k]<=n)//找到第k个皇后的合适位置 
		{
			if(k==n)//(皇后全部放置) 
				dispasoulution(n);//当满足k==n时,输出这个解 
			else
			{
				k++;//向下一行放置皇后 
				q[k]=0;//从第一列开始 
			}
		}
		else//如果没有找到合适的存放皇后的位置 
		{
			if(k==1) exit(0);//如果回溯完成,算法结束 
			k--;//回溯到上一行 
		}
	}
	
}
void again()
{
	int n;
	printf("请重新输入一个合适的N值:\\n");
	scanf("%d",&n);	
	if(n==1&&n>=4||n<=20)
		queens(n);
	else
		printf("禁止再次输入\\n");
}
int main()
{
	int n;
	printf("n皇后问题(n<20)\\nn=");
	scanf("%d",&n);
	if(n>1&&n<4||n>20)
		{
			printf("n值不满足情况!\\n");
			again();
		}
	else
		{
			printf("n皇后的问题求解如下:\\n");
			queens(n);
		} 
} 

以上是关于基于C语言的n皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

求教C语言回溯法写出八皇后问题的92种解

八皇后问题的遗传算法解法,c语言编写

n皇后问题(C语言 回溯算法)

n皇后问题(C语言 回溯算法)

《三子棋》C语言数组应用 --n皇后问题雏形

HDU2553 N皇后问题