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;
}

 


版权声明:本文为weixin_42204569原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。