八皇后问题

八皇后问题

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。

#!/bin/python3

'''
检查如果在(row,col)放置皇后,是否与之前的皇后能够相互攻击
  size: 棋盘大小size * size大小
  pos: list数组,存储已经放置的皇后的位置,元素为{"row": x, "col": y}
  row: 新皇后的x坐标
  col: 新皇后的y坐标
'''
def check_conflict(size, pos, row, col):
  for mem in pos:
    r1 = mem["row"]
    c1 = mem["col"]
    if(col == c1):
      return 1
    if(row-r1 == col-c1):
      return 1
    if(row-r1 == c1-col):
      return 1
  return 0
'''
  递归方法寻找结果集
  size: 棋盘大小size * size大小
  pos: list数组,存储已经放置的皇后的位置,元素为{"row": x, "col": y}
  row: 扫描row一行所有位置,看是否有解
  record: 若果有解,记录结果集
'''
def putQueen(size, pos, row, record):
  #row==size时,表示在size*size棋盘上已经放置了size个皇后,有解,并将记录皇后位置的结果保存到record
  if(row == size):
    record.append(pos)
    return 1
  ret = pos
  #依次扫描row上的所有位置
  for col in range(size):
    #检查在(row,col)放置一个皇后,是否能够攻击之前已经放置的皇后
    if(check_conflict(size, pos, row, col) == 1):
      continue
    #在(row,col)的皇后可以放置,记录下此时的位置
    tmp_pos = pos.copy()
    new_mem = {}
    new_mem["row"] = row
    new_mem["col"] = col
    tmp_pos.append(new_mem)
    #放置下一行的皇后
    rc = putQueen(size, tmp_pos, row+1, record)
    #rc==0,表示row+1行无法放置皇后,无解,扫描下一个点
    if(rc == 0):
      continue
    #rc!=0表示有解
    #return 1 #如果只需要找一种解,此处返回1即可
    
  #扫描完所有结果返回,此处返回值无关紧要
  return 1
def printResult(pos, size):
  for mem in pos:
    ch = "*"
    col = mem["col"]
    for i in range(size):
      if(i == col):
        ch = "A"
      else:
        ch = "*"
      print(" %s " % (ch), end='')
    print("\n")

#可以改成n皇后问题
size = 8
pos = []
row = 0
record = []
ret = putQueen(size, pos, row, record)
print(len(record))
for i in range(len(record)):
  printResult(record[i], size)
  print("====================")
    

结果:
92

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值