算法——八皇后

八皇后问题

这是一个经典递归问题,问题要求:在一个n*n的棋盘上摆放n个皇后,要求两个皇后不能出现在同一横排,纵列,斜线上。


下图是8*8的棋盘:


运用递归的方法可以很容易实现出来,得到结果显示这种棋盘n=8的情况下有92中摆放方式。

#include <stdio.h>
#include <stdlib.h>
const int N = 8;//
int queens[N] = {0};//每一行都有且只有1个皇后,保存数据表示位于第几列 0~7
int count =1 ;
void printqueen()
{
	printf("case:%d\n",count);
	int i,j;
	for (i = 0;i<N ;i++ )
	{
		printf("%d",queens[i]);
	}
	printf("\n=======棋盘=======:\n");
	for (i = 0;i<N ;i++ )
	{
		j = 0;
		while(j<queens[i])
		{
			printf("0 ");
			j++;
		}
		printf("1 ");
		j = queens[i]+1;
		while(j<N)
		{
			printf("0 ");
			j++;
		}
		printf("\n");
	}
	printf("==================\n");
}
bool oneline(int order)//在一条线上false
{
	int i=0;
	while(i<order)
	{
		if (queens[order] == queens[i])
			return true;
		if(abs(queens[order] - queens[i]) == (order - i))
			return true;
		i++;
	}
	return false;
}
void eightqueen(int num)
{
	if (num >7)
	{
		printqueen();
		count++;
		return;
	} 
	int i; 
	for (i = 0;i<N ;i++ )
	{
		/*
		queens[num] = i;
		if(oneline(i,num))//第num行上位置i
		{
			continue;
		}
		else
		{
			//printf("queens[%d] = %d\n",num,queens[num]);
			eightqueen(num+1);
		}*/
		queens[num] = i;
		if(!oneline(num))
			eightqueen(num+1);
	}
	//getchar();
}
int main()
{
	eightqueen(0);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值