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

44 篇文章 1 订阅

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

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皇后会有多大差距呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值