[C语言入门题] 八皇后问题

题目描述

国际象棋棋盘是一个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);
        }
}

猜你喜欢

转载自blog.csdn.net/qq_36039136/article/details/78796451
今日推荐