找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2331|回复: 1

[求助] python 八皇后问题

6

主题

10

帖子

10

积分

贫民

积分
10
robin_xzz 发表于 2019-4-11 21:33:47 | 显示全部楼层 |阅读模式
import random
def confict(state,nextX):
    nextY=len(state)
    for i in range(nextY):
        if abs(state[i]-nextX) in (0,nextY-i):
            return True
def queens(num=8,state=()):
    for pos in range(num):
        if not confict(state,pos):
            if len(state)==num-1:
                yield(pos,)--------------------------------------------------前面三个为(1,3,0),最后一个符合条件的为2,  yield(pos,)执行这一步就终止了,单独返回(2,)怎么会把2合入到元组中,变成(1,3,0,2)?
            else:
                for result in queens(num,state+(pos,)):
                    yield (pos,) + result


回复

使用道具 举报

0

主题

102

帖子

102

积分

侠客

积分
102
傻眼貓咪 发表于 2021-8-8 14:06:32 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-8-8 14:08 编辑

如果沒有錯,你這題應該是由西洋棋棋手馬克斯·貝瑟爾(Max Bezzel)於1848年提出的八皇后問題吧?

八皇后問題:
如何能夠在8×8的西洋棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。

以下為我的代碼,不夠完善,基本只能隨機生成答案,但不能計算一共多少種答案(維基百科:已知曉92個有效答案,扣除獨立答案為12)
  1. # Author: 傻眼貓咪
  2. # 2021.08.08

  3. import random

  4. def randomValidBoard(N): # 函數:隨機生成有效棋盤
  5.     board = None

  6.     def randomSeed(N) -> 'random seed': # 隨機生成 N 個位置
  7.         position = [i for i in range(N)]
  8.         board = []
  9.         for i in range(N):
  10.             while True:
  11.                 temp = random.choice(position)
  12.                 if temp in board:
  13.                     continue
  14.                 else:
  15.                     board.append(temp)
  16.                     break
  17.         return board

  18.     def diagonallyCheck(brd: 'board', val: 'value') -> bool: # 函數:檢查位置是否有效,符合條件?
  19.         r1 = r2 = l1 = l2 = val # 值
  20.         R = L = brd.index(val) # 指針
  21.         while True:
  22.             if R+1 <= 7:
  23.                 R += 1 # 值
  24.                 r1 += 1 # 指針
  25.                 r2 -= 1
  26.                 if brd[R] == r1 or brd[R] == r2:
  27.                     return False
  28.                 else:
  29.                     continue
  30.             if L-1 >= 0:
  31.                 L -= 1
  32.                 l1 += 1
  33.                 l2 -= 1
  34.                 if brd[L] == l1 or brd[L] == l2:
  35.                     return False
  36.                 else:
  37.                     continue
  38.             if R+1 > 7 and L-1 < 0:
  39.                 break
  40.         return True

  41.     def allValid(brd: 'board') -> bool: # 函數:確定棋盤全部有效
  42.         for i in brd:
  43.             if diagonallyCheck(brd, i) == False:
  44.                 return False
  45.         return True
  46.    
  47.     while True: # 重複生成無數個棋盤,直至某個有效棋盤為止
  48.         board = randomSeed(N)
  49.         if allValid(board) == True:
  50.             break

  51.     return board # 最終回傳有效棋盤

  52. def showingBoard(brd: 'borad', N) -> print(): # 列印函數:列印出有效棋盤的擺放位置
  53.     flag = []
  54.     for i in range(N):
  55.         temp = []
  56.         queen = False
  57.         for j in range(N):
  58.             for k in range(N):
  59.                 if i == k and brd[k] == j:
  60.                     queen = True
  61.             if queen == True:
  62.                 temp.append('♕')
  63.                 queen = False
  64.             else:
  65.                 temp.append('▢')
  66.         flag.append(temp)
  67.     for i in flag:
  68.         for count, j in enumerate(i):
  69.             if count < 7:
  70.                 print(j, end = ' ')
  71.             else:
  72.                 print(j)

  73. def main(): # 主函數
  74.     N = 8
  75.     showingBoard(randomValidBoard(N), N)

  76. if __name__ == '__main__':
  77.     main()
复制代码

隨機得出有效結果(目前已知92種答案正確):
  1. ▢ ▢ ♕ ▢ ▢ ▢ ▢ ▢
  2. ▢ ▢ ▢ ▢ ▢ ♕ ▢ ▢
  3. ▢ ▢ ▢ ▢ ▢ ▢ ▢ ♕
  4. ▢ ♕ ▢ ▢ ▢ ▢ ▢ ▢
  5. ▢ ▢ ▢ ♕ ▢ ▢ ▢ ▢
  6. ♕ ▢ ▢ ▢ ▢ ▢ ▢ ▢
  7. ▢ ▢ ▢ ▢ ▢ ▢ ♕ ▢
  8. ▢ ▢ ▢ ▢ ♕ ▢ ▢ ▢
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表