Python使用元组+递归简单解决八皇后问题

一、基本思想是用元素进入元组的先后表明行号,具体数值表明列号,注释很清楚了就不再说明,直接贴代码了

import time
def yesnot(state,nextX):                            # 判断下一个皇后在当前状态下时候可放
    nextY = len(state)                              #存放已经放了几行
    for i in range(nextY):                          #测试当前皇后与之前的是否冲突
        if abs(nextX - state[i]) in (0,nextY - i):  #abs(nextX - state[i])表明横向距离,in(0,nextY - i)表示0或extY - i,0表明在同一列上,(nextY - i)表明在斜线上只要一个相等返回错误
            return False
    return True                                     #若未返回错误则新位置可放皇后,返回正确

def queen(state,num):
    for i in range(num):                            #遍历寻找可以放的地点
        if yesnot(state, i):                        #判断i点时候和以往皇后是否冲突
            if len(state) == num - 1:               #如果皇后数量时候已满
                print(state + (i,))                 #满足条件添加到元组并输出
            else:
                queen(state + (i,), num)            #不冲突把新的皇后位置添加到元组进行递归

t = time.time()                                     #程序开始时间
queen((),8)                                         #运行八皇后问题,8是皇后数
t2 = time.time()                                    #程序结束时间
print(t2-t)                                         #程序运行时间

二、八皇后相同算法java版

三、我的程序运行12皇后时python版耗时13~14s,java版耗时400ms左右,不知道为什么相同代码python耗时远高于java,如果有大佬知道欢迎指导。我知道python运行会慢一些但是没想到慢这么多,如果30或者50,100皇后会有多大差距呢?

你可能感兴趣的:(python,递归)