题目描述
国际象棋棋盘是一个8*8的方格。在每个格子上都可以放置棋子。
皇后可以在水平方向、竖直方向、以及对角线方向(+-45°方向)以任意距离进行攻击。
现有8个皇后,请你将其放置在棋盘中,使得她们不互相攻击。
把每一种放法记为一个字符串b1b2...b8。其中bi表示第i行的皇后放在第几列(1~8)。
我们对所有的解根据其对应的数值大小按照由小到达排列。
可以偷偷告诉你,八皇后问题有92种可能的输出。现在给你n,请你输出第n个解对应的字符串(n从1开始)。
输入
输入若干个整数。每一行是一个n。
输出
每行对应第n个字串。
样例输入
13
14
10
11
12
样例输出
13: 31758246
14: 35281746
10: 27368514
11: 27581463
12: 28613574
提示
请用递归思想。
八皇后(第i个棋子)
{
当所有棋子都摆好,返回。
遍历所有位置
{
如果当前位置能摆 则摆,然后 八皇后(i+1)
}
}
#include <stdio.h>
int ok(int k);void p(int i);
int x[8];
int a; int sum;
int main()
{
//int a;
while (scanf("%d", &a) != EOF)
{
sum = 0;
p(0);
}
}
int ok(int k)
{
for (int j = 0; j < k; j++)
if (k - j == x[j] - x[k]||k-j==x[k]-x[j] || (x[j] == x[k])) return 0;
return 1;
}
void p(int t)
{
if (t == 8)
{
sum++;
if (sum== a)
{
int i; for (i = 0; i < 8; i++) x[i]++;
printf("%d: ", a);
for (i = 0; i < 8; i++)
{
printf("%d", x[i]);
}
printf("\n");
}
}
else
for (int i = 0; i < 8; i++)
{
x[t] = i;
if (ok(t)) p(t + 1);
}
}