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