0037-八皇后问题

问题描述

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。对于某个满足要求的8皇后的摆放方法, 定义一个皇后串a与之对应, 即a=b1b2...b8, 其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1<=b<=92)

输出

n 行,每行输出对应一个输入。输出应是一个正整数,是对应于 b 的皇后串

输入样列

2
1
92

输出样例

  15863724
84136275

算法实现

using System;

namespace Questions{
    class Program{
        public static void Main(string[] args){
            int[,] queen = new int[92, 8];
            int[] result = new int[8];
            int x = 0;
            Queen(0, ref x, ref result, ref queen);
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                int b = int.Parse(Console.ReadLine());
                for (int j = 0; j < 8; j++)
                {
                    Console.Write(queen[b - 1, j]);
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
        public static void Queen(int t, ref int x, ref int[] result, ref int[,] queen)
        {
            if (t > 7)
            {
                for (int i = 0; i < 8; i++)
                    queen[x, i] = result[i];
                x++;
            }
            else
            {
                for (int i = 1; i <= 8; i++)
                {
                    result[t] = i;
                    if (IsResult(t, result))
                    {
                        Queen(t + 1, ref x, ref result, ref queen);
                    }
                }
            }
        }
        public static bool IsResult(int t, int[] result)
        {
            for (int i = 0; i < t; i++)
            {
                if (result[i] == result[t] || Math.Abs(i - t) == Math.Abs(result[i] - result[t]))
                    return false;
            }
            return true;
        }
    }
}

你可能感兴趣的:(0037-八皇后问题)