8皇后问题以至于N皇后

皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

8皇后问题一共有92组解,

8皇后必定不能同一行,因此按行来依次放置皇后到不同列。

解决这个问题主要用到递归来依次放置8个皇后,每次放置要check放置是否合理,合理的进入下一个皇后放置,不合理的continue本次循环,直至本行没有位置返回上一级皇后放置。

对于N皇后也是如此。

输出八皇后的指定n组序列:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int way[92][9], tem[9], k = 1, n = 8, tim = 0;
//int aaaaaaaa = 0;

//检查棋盘是否合理,1合理0不合理
int check(){
	for (int i = 1; i <= k; i++)//检查第i个皇后是否合理
	{
		for (int j = i + 1; j <= k; j++)
		{
			if ((tem[i] == tem[j]) || (tem[i] - tem[j] == i - j) || (tem[i] - tem[j] == j - i))//在同一列,对角线
				return 0;
		}
	}
	return 1;
}
//fun递归来放置皇后
int fun(){
	for (int i = 1; i <= 8; i++)
	{
		tem[k] = i;//临时存放皇后k的列
		if (check()==0){//不通过
			continue;
		}
		if (k == 8){//全部摆放完
			for (int j = 1; j <= 8; j++)
				way[tim][j] = tem[j];
			tim++;//组数
		//	printf("%d\n", aaaaaaaa);
		//	aaaaaaaa++;
			tem[k] = 0;
			continue;
		}
		k++;
		fun();
	}
	tem[k] = 0;
	k--;
	return 0;
}

int main(){
	int n,ans[92];
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &ans[i]);
	fun();
	for (int i = 0; i < n; i++){
		for (int j = 1; j <= 8; j++)
			printf("%d", way[ans[i]-1][j]);
		printf("\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super algorithm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值