皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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;
}