赞
踩
四皇后问题出现在回溯算法里,所以主要采用回溯算法解决
一共有三个函数实现,作用分别是初始化棋盘,选择皇后所在位置,显示出来
- def InitGrid(d):
- """
- 功能:棋盘初始化
- 参数:d表示矩阵的大小
- """
- grid=[[(x+1,y+1) for y in range(d)] for x in range(d)]
- return grid
- # 这里是利用列表推导式初始化棋盘,相当于:
- # grid=[]
- # for x in range(d): # 生成行
- # a=[]
- # for y in range(d): # 生成列
- # a.append((x+1,y+1))
- # grid.append(a)
-
- import math
- import random
-
- def fill(grid,rowIndex,position,backtracking):
- """
- 功能:指定行过滤出可选位置,随机选取一个,作为本行“皇后”的填入位置
- 参数:grid:棋盘矩阵
- rowIndex:指定矩阵的某一行的序号
- position:已被选的位置
- backtracking:回溯时的排除项列表
- """
- row=grid[rowIndex] # 每次都取一行
- optional=[]
- if len(position)!=0:
- for column in row:
- avaliable=True
- for item in position:
- if column[1]==item[1] or column[0]+column[1]==item[0]+item[1] or\
- column[0]-column[1]==item[0]-item[1] or column in backtracking:
- # 不可能出现同行,所以是防止出现在同列,同斜线/或\,或位于排除项列表中
- available=False
- if available:
- optional.append(column)
- else:
- optional=row
- if len(optional)==0:
- return 0
- else:
- radomIndex=math.floor(len(optional)*random.random())
- # math.floor()是直接截取浮点数的整数部分
- # random.random()是随机取[0,1)的中的任意整数或分数
- pick=optional[randomIndex]
- position.append(pick)
- return 1
- def show(positions):
- """
- 功能:将最终结果用棋盘网格显示出来
- 参数:positions:最终挑选的位置列表
- """
- figure=''
- for row in range(4):
- for line in range(4):
- if (row+1,line+1) in positions:
- figure+='Q '
- else:
- figure+='# '
- figure+='\n'
- return figure
- import math
- import random
-
- def InitGrid(d):
- """
- 功能:棋盘初始化
- 参数:d表示矩阵的大小
- """
- grid=[[(x+1,y+1) for y in range(d)] for x in range(d)]
- return grid
- # 这里是利用列表推导式初始化棋盘,相当于:
- # grid=[]
- # for x in range(d): # 生成行
- # a=[]
- # for y in range(d): # 生成列
- # a.append((x+1,y+1))
- # grid.append(a)
-
- def fill(grid,rowIndex,position,backtracking):
- """
- 功能:指定行过滤出可选位置,随机选取一个,作为本行“皇后”的填入位置
- 参数:grid:棋盘矩阵
- rowIndex:指定矩阵的某一行的序号
- position:已被选的位置
- backtracking:回溯时的排除项列表
- """
- row=grid[rowIndex] # 每次都取一行
- optional=[]
- if len(position)!=0:
- for column in row:
- avaliable=True
- for item in position:
- if column[1]==item[1] or column[0]+column[1]==item[0]+item[1] or\
- column[0]-column[1]==item[0]-item[1] or column in backtracking:
- # 不可能出现同行,所以是防止出现在同列,同斜线/或\,或位于排除项列表中
- available=False
- if available:
- optional.append(column)
- else:
- optional=row
- if len(optional)==0:
- return 0
- else:
- radomIndex=math.floor(len(optional)*random.random())
- # math.floor()是直接截取浮点数的整数部分
- # random.random()是随机取[0,1)的中的任意整数或分数
- pick=optional[randomIndex]
- position.append(pick)
- return 1
-
- def show(positions):
- """
- 功能:将最终结果用棋盘网格显示出来
- 参数:positions:最终挑选的位置列表
- """
- figure=''
- for row in range(4):
- for line in range(4):
- if (row+1,line+1) in positions:
- figure+='Q '
- else:
- figure+='# '
- figure+='\n'
- return figure
- """主运行代码"""
- grid=InitGrid(4)
- position=[]
- backtracking=[[] for i in range(4)]
- row=0
- while row<4:
- success=fill(grid,row,position,backtracking[row])
- if success==1:
- row+=1
- else:
- row-=1
- backtracking[row].append(position.pop())
- if row<3:
- backtracking[row+1]=[]
- print(show(positon))
就将数字4改成8,第77行的数字3改成7,就变成了八皇后问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。