八皇后问题
问题描述:
国际象棋中,皇后可以在横、竖、斜线上不限步数地吃掉其它棋子,如何将8个皇后放在8*8的棋盘上,使它们谁也不能吃掉谁,便是著名的八皇后问题。
对于某个满足要求的八皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相对应摆法中第i个皇后所处的列数。已经知道八皇后问题一共有92组解(即92个不同的皇后串)。给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入数据:
第一行是测试数据的组数n,后面跟着n行输入。每行测试数据占一行,包括一个正整数b(1≤b≤92)。
输出要求:
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应与b的皇后串。
输入样例:
2
1
92
输出样例:
15863724
84136275
解题思路:
本题较易想到的方法是采用八重循环来实现,但是其耗时太长,且容易混乱。这里采用递归的方法实现。首先八个皇后只能分别居于八个不同的行(由题可知),若把第i个皇后放在第i行,然后用一个循环控制第i个皇后所处的列(一至八列记为j),当(i,j)确定那么这个皇后的位置就被唯一确定,再把(i,j)和之前的皇后的所处位置向比较(假如之前皇后已经记录在hang[k]这个1*8的数组中),那么如果 j==hang[k] 或 abs(k-i)==abs(hang[k]-j)) 即第i个皇后和之前的结果处于同一列或同一斜线上,那么这个皇后(i,j)的摆法就不合适,直接break出去。当判断j这个循环是正常执行完毕(未break),对每组(i,j)记录hang[i]=j

3003

被折叠的 条评论
为什么被折叠?



