N皇后问题

家人们随意看看吧~

闲的没事儿写的

原谅我不正经的注释

by Theophilus

#include<stdio.h>
#include<math.h>

int N=8; //八皇后问题
int X[9];  //为 N 个皇后对应横坐标位置 按顺序 【】内为行纵坐标顺序  其中数字为 N+1;  
int num=0; //一共多少种可能性;
 


void Queen( int k )   // 其中 k 为第几行的皇后 
{
	int i,j,check;

	
	//边界: 
	if(k>N)
	{ // 递归之后 如果 行数超过了 N 则说明前面摆放的皇后没有问题, 即可打印对应皇后的位置 并继续将第一行的皇后位移计算新的可能性 
	
		num++;   //可能性加一哦! 
		for(i=1;i<=N;i++)
		{
			printf("%d ",X[i]);  //打印咯 
		}
		printf("\n");
	}
	
	if( k<=N )
	{
		for(i=1;i<=N;i++)   // 每一行的皇后逐列挨个试试 i 就是对应的列 
		{
			check=1;
			
			if(k==1)   //当 这是第一行的皇后时 直接赋值i 
			{
				X[k]=i;
				Queen(k+1); //赋值之后直接可以开始计算下一行 
				
			}
			
			if(k!=1)   // 当 这不是第一行的皇后 需要进行 和之前所有的皇后 1.不同列 2.斜率不为零  若满足 则给 X[k] 赋值 
			{
				for(j=1;j<k;j++) // j 是 k 之前的行  看看这个第 k 行的 i符不符合要求 不符合, i 继续加一 
				{
					if( (X[j]==i) || (abs(k-j)==abs(i-X[j])) )  //条件啊!!满足了check就是 1 就能继续赋值 
					{
						check=0;
					}
				}
				if(check) // i满足了 在这个地方的条件 ,即可赋值给X[k]!!!!
				{
					X[k]=i; 
					Queen(k+1); 
				}	
			}
		} 
		return ;
	}	
} 

int main ()
{
	Queen(1);
	printf("总数量为:%d", num);
	return 0;
}
 
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值