美文网首页C#题库
0037-八皇后问题

0037-八皇后问题

作者: 指尖极光 | 来源:发表于2017-03-25 15:29 被阅读27次

问题描述

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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-八皇后问题

    问题描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8...

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 八皇后问题

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘...

  • 八皇后问题

    问题 八皇后问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪数学家高斯1850年手工解决。原题为在...

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • 八皇后问题

    如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任两个皇后都不能处于同一条横行、纵行或斜线上。 先从第一列开...

网友评论

    本文标题:0037-八皇后问题

    本文链接:https://www.haomeiwen.com/subject/hjscottx.html