python实现八皇后问题(百练OJ:2754:八皇后)

题目链接:八皇后

描述

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b 1b 2...b 8,其中b i为相应摆法中第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
def queen(A, cur=0):

    if cur==len(A):
        #这里len(A)的值为8,当发现cur==8时候,
        # 说明前面的0-7都已经找到了正确的位置,
        # 这就是一个满足要求的结果
        b.append(list(A))
    else:
        for col in range(len(A)):
            A[cur] = col #表示把第cur行的皇后放在col列上

            ok = True  #用ok这个值来记录是否冲突

            #以下这个for 循环判断是判断 第cur行是否更前面的皇后冲突
            for r in range(cur):
                if A[r]==col or r-A[r]==cur-A[cur] or r+A[r]==cur+A[cur]:#判断是否跟前面的皇后冲突
                    ok = False  ##一旦发现冲突标记一下
                    break       ##一旦发现冲突标记一下之后停止计算
            if ok:
                #若是发现了跟前面的皇后冲突了,说明当前cur行是不能放在col列上面的,
                # 于是就 进行下一次的  for col in range(len(A))循环,也就是去测下一个col值行不行
                #若是发现当前行的cur的col没有与前面的冲突,那么就开始对下一行寻找合适放置位置即寻找col值
                queen(A,cur+1)

b=[]  #用来存储所有的解决方案
queen([0]*8, 0)

#以下操作实现题目的输出要求
n=int(input())
for i in range(n):
    x=int(input())
    a=b[x-1]
    for j in range(8):
        print(a[j]+1,end="")
    print()



你可能感兴趣的:(百练OJ与leetcode,八皇后,python)