C语言递归解决八皇后问题

c语言代码:

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

void show(); /*打印矩阵*/ 
int check(int queen_id); /*判断该位置是否能够放置皇后*/ 
void eight_queen(int n); /*摆放*/

int queens[8]; /*定义一个长度为8的数组,代表八个皇后所在行的第几列,8代表八行*/ 
int sum=0; /*记录摆法总数*/ 
int max=8; /*限制摆放八个皇后*/ 

int main(void)
{
	/*开始摆放皇后,从0,也就是第一个皇后开始摆放,0代表第一个皇后对应数组下标,方便用定义的数组来描述皇后的位置*/
	eight_queen(0); 
	printf("\n共%d种方法!", sum);
	return 0;
}

void show()
{
	printf("\n\nThis is solution no.%d!\n", sum);
	for(int i=0;i<max;i++)
	{
		for(int j=0;j<max;j++)
	 	{
	 		/*判断该位置是否与皇后所在位置相同*/ 
	 		if(queens[i]== j)
	 			printf("M");
	 		else
	 			printf("-");
	 	}
		printf("\n");
	}
}

int check(int queen_id)
{
	for(int i=0;i<queen_id;i++)
	{
		/*待摆放的皇后不能与已摆放的皇后同列或者在同一对角线上*/ 
		/*同一对角线的两个皇后它们的行数相减的绝对值等于列数相减的绝对值*/ 
		if(queens[i] == queens[queen_id] || abs(queens[queen_id] - queens[i]) == (queen_id - i))
			return 0;
	}
	return 1;
}

void eight_queen(int n)
{
	if(n<max)
	{	
		/*每次从第n+1行的第一列开始摆放*/ 
		for(int j=0;j<max;j++)
		{
			queens[n] = j;
			if(check(n))
				/*如果第n个皇后可以摆放则摆放第n+1个皇后*/ 
				/*因为待摆放皇后不能跟前一个同行,所以默认是从下一行的第一列开始摆放*/ 
				eight_queen(n+1);
		}
	}
	else
	{	
		/*摆完八个皇后,摆法总数加 1 */
		sum++;
		show(); 
	}
}

最后执行结果:
在这里插入图片描述
总结:就是每次放皇后时从每行的第一列开始放置,满足条件则开始放置下一个皇后;如果不满足条件,则放第二列,继续判断是否符合条件,倘若该行都不能放置,返回上一行,移动该行的皇后到下一列,判断是否符合条件,符合则开始下一行皇后,不符合则又放置该行下一列。如此反复!
————————————————————
——————————
—————
——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值