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

说明:N皇后问题是在n行n列的棋盘上放置N个皇后,使得皇后彼此之间不受攻击,其规则是任意两个皇后不在同一行,同一列和相同的对角线上

算法思路:第i个皇后放在第i行,从第一个皇后开始,对每个皇后从其对应行(第i个皇后对应第i行)的第一个位置开始尝试放置位置,如可以放置,确定该位置,考虑下一个皇后;若于之前皇后有冲突,则考虑下一列;若超出最后一列,则重新确定上一个皇后的位置。重复该过程,知道找到所有的解决方案。

下面是算法的C语言实现
(1)常量和变量说明
pos:一维数组,pos[i]表示第i个皇后放置在第i行的具体位置
count:统计放置方案数
i,j,k:变量
N:皇后数

(2)C程序如下

#include <stdio.h>
#include <math.h>
#define N 4

//判断第k个皇后目前的放置位置与之前的皇后是否有冲突 
int isplace(int pos[],int k)
{
	int i;
	for(i=1;i<k;i++)
	{
		//分别为判断是否在同一列,是否在对对角线 
		if(pos[i] == pos[k] || fabs(i-k) == fabs(pos[i] - pos[k]))
			return 0;
	}
	return 1;
}


int main()
{
	int i,j,count=1;
	int pos[N+1];
	for(i=1;i<=N;i++)
	{
		pos[i] = 0;
	}
	j = 1;	//从第一皇后开始 
	while(j>=1)
	{
		pos[j] = pos[j]+1;
		//尝试摆放第一个皇后 
		while(pos[j]<=N && !isplace(pos,j))
		{
			pos[j] = pos[j]+1;
		}
		
		//得到第一个摆放方案 
		if(pos[j]<=N && j == N)
		{
			printf("方案%d: ",count++);
			for(i=1;i<=N;i++)
			{
				printf("%d ",pos[i]);
			}
			printf("\n");
		}
		
		//考虑下一个皇后
		if(pos[j]<=N && j<N)
		{
			j = j+1;	
		}else{	//返回考虑上一个皇后 
			pos[j] = 0;	
			j--;
		} 
	}
	return 0;
} 

执行结果:
方案一:2 4 1 3
方案二:3 1 4 2

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值