当前位置:   article > 正文

Python:四皇后问题_python4皇后问题

python4皇后问题

概要:

皇后问题出现在回溯算法里,所以主要采用回溯算法解决

一共有三个函数实现,作用分别是初始化棋盘,选择皇后所在位置,显示出来

第一个函数:InitGrid(d)

  1. def InitGrid(d):
  2. """
  3. 功能:棋盘初始化
  4. 参数:d表示矩阵的大小
  5. """
  6. grid=[[(x+1,y+1) for y in range(d)] for x in range(d)]
  7. return grid
  8. # 这里是利用列表推导式初始化棋盘,相当于:
  9. # grid=[]
  10. # for x in range(d): # 生成行
  11. # a=[]
  12. # for y in range(d): # 生成列
  13. # a.append((x+1,y+1))
  14. # grid.append(a)

第二个函数:fill(grid,rowIndex,position,backtracking):

  1. import math
  2. import random
  3. def fill(grid,rowIndex,position,backtracking):
  4. """
  5. 功能:指定行过滤出可选位置,随机选取一个,作为本行“皇后”的填入位置
  6. 参数:grid:棋盘矩阵
  7. rowIndex:指定矩阵的某一行的序号
  8. position:已被选的位置
  9. backtracking:回溯时的排除项列表
  10. """
  11. row=grid[rowIndex] # 每次都取一行
  12. optional=[]
  13. if len(position)!=0:
  14. for column in row:
  15. avaliable=True
  16. for item in position:
  17. if column[1]==item[1] or column[0]+column[1]==item[0]+item[1] or\
  18. column[0]-column[1]==item[0]-item[1] or column in backtracking:
  19. # 不可能出现同行,所以是防止出现在同列,同斜线/或\,或位于排除项列表中
  20. available=False
  21. if available:
  22. optional.append(column)
  23. else:
  24. optional=row
  25. if len(optional)==0:
  26. return 0
  27. else:
  28. radomIndex=math.floor(len(optional)*random.random())
  29. # math.floor()是直接截取浮点数的整数部分
  30. # random.random()是随机取[0,1)的中的任意整数或分数
  31. pick=optional[randomIndex]
  32. position.append(pick)
  33. return 1

第三个函数:show(positions):

  1. def show(positions):
  2. """
  3. 功能:将最终结果用棋盘网格显示出来
  4. 参数:positions:最终挑选的位置列表
  5. """
  6. figure=''
  7. for row in range(4):
  8. for line in range(4):
  9. if (row+1,line+1) in positions:
  10. figure+='Q '
  11. else:
  12. figure+='# '
  13. figure+='\n'
  14. return figure

总的代码:

  1. import math
  2. import random
  3. def InitGrid(d):
  4. """
  5. 功能:棋盘初始化
  6. 参数:d表示矩阵的大小
  7. """
  8. grid=[[(x+1,y+1) for y in range(d)] for x in range(d)]
  9. return grid
  10. # 这里是利用列表推导式初始化棋盘,相当于:
  11. # grid=[]
  12. # for x in range(d): # 生成行
  13. # a=[]
  14. # for y in range(d): # 生成列
  15. # a.append((x+1,y+1))
  16. # grid.append(a)
  17. def fill(grid,rowIndex,position,backtracking):
  18. """
  19. 功能:指定行过滤出可选位置,随机选取一个,作为本行“皇后”的填入位置
  20. 参数:grid:棋盘矩阵
  21. rowIndex:指定矩阵的某一行的序号
  22. position:已被选的位置
  23. backtracking:回溯时的排除项列表
  24. """
  25. row=grid[rowIndex] # 每次都取一行
  26. optional=[]
  27. if len(position)!=0:
  28. for column in row:
  29. avaliable=True
  30. for item in position:
  31. if column[1]==item[1] or column[0]+column[1]==item[0]+item[1] or\
  32. column[0]-column[1]==item[0]-item[1] or column in backtracking:
  33. # 不可能出现同行,所以是防止出现在同列,同斜线/或\,或位于排除项列表中
  34. available=False
  35. if available:
  36. optional.append(column)
  37. else:
  38. optional=row
  39. if len(optional)==0:
  40. return 0
  41. else:
  42. radomIndex=math.floor(len(optional)*random.random())
  43. # math.floor()是直接截取浮点数的整数部分
  44. # random.random()是随机取[0,1)的中的任意整数或分数
  45. pick=optional[randomIndex]
  46. position.append(pick)
  47. return 1
  48. def show(positions):
  49. """
  50. 功能:将最终结果用棋盘网格显示出来
  51. 参数:positions:最终挑选的位置列表
  52. """
  53. figure=''
  54. for row in range(4):
  55. for line in range(4):
  56. if (row+1,line+1) in positions:
  57. figure+='Q '
  58. else:
  59. figure+='# '
  60. figure+='\n'
  61. return figure
  62. """主运行代码"""
  63. grid=InitGrid(4)
  64. position=[]
  65. backtracking=[[] for i in range(4)]
  66. row=0
  67. while row<4:
  68. success=fill(grid,row,position,backtracking[row])
  69. if success==1:
  70. row+=1
  71. else:
  72. row-=1
  73. backtracking[row].append(position.pop())
  74. if row<3:
  75. backtracking[row+1]=[]
  76. print(show(positon))

如果是八皇后问题

就将数字4改成8,第77行的数字3改成7,就变成了八皇后问题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/64124
推荐阅读
相关标签
  

闽ICP备14008679号