您现在的位置是:主页 > news > 登封郑州网站建设/怎么在百度上设置自己的门店
登封郑州网站建设/怎么在百度上设置自己的门店
admin2025/5/2 23:11:10【news】
简介登封郑州网站建设,怎么在百度上设置自己的门店,属于网站设计内容的是,阳江网雨大医院文章目录n皇后1.解法2.总结pythonn皇后 1.解法 n皇后问题是比较经典的棋盘问题。而棋盘问题也是回溯问题中的一种。 总体思路是:按照行(或列)遍历,首先确定第一行的一个皇后的位置,然后去确定第二行皇后的位置&…
文章目录
- n皇后
- 1.解法
- 2.总结
- python
n皇后
1.解法
n皇后问题是比较经典的棋盘问题。而棋盘问题也是回溯问题中的一种。
总体思路是:按照行(或列)遍历,首先确定第一行的一个皇后的位置,然后去确定第二行皇后的位置(确定的方法就是1.不能同行 2.不能同列 3.不能在对角线),然后去确定第三行的皇后…直到确定到最后一行。如果最后一行能找到一个答案,那么就可以把答案保存下来;如果在中途(即遍历的行小于n)就找不到了,那么对把上一行确定的皇后取消,然后使得上一行的下一个位置为皇后,重复同样的操作。
n=3时,如图所示(图中只具体画了第一行取1的部分):
确定了总体思路,我们就可以执行回溯三部曲:
-
确定函数头和辅助变量:
result = [] # 存放所有结果chessboard = [ ['.']*n for _ in range(n) ] # 棋盘初始化'''1.遍历结束的时候就是row==n的时候,所以需要n2.每次进行遍历的时候都要知道要遍历哪行,所以要有row3.每次遍历都要修改棋盘,所以要有chessboard'''def backtracking(n,row,chessboard):
-
确定递归出口:
前面也说了,当此次递归(遍历)的行数row==n的时候,那么就证明已经有了一个答案。
if row == n:# 由于棋盘每一行都是一个list,而答案每一行都是一个字符串,所以要转换一下temp_res = []for temp in chessboard:temp_str = "".join(temp)temp_res.append(temp_str)result.append(temp_res)return
-
确定递归逻辑:
因为递归本身是对行的遍历,所以我们只要再遍历列,就可以遍历每行中每一个位置了,所以需要一个for循环来遍历所有列,如果刚确定的[row][col]这个位置和chessboard上已有的皇后位置不冲突,那么就可以使得chessboard[row][col] = ‘Q’,然后进行下一行的递归,完成下一行递归后要回溯。
for col in range(n):if isValid(row,col,chessboard,n): # isValid用来判断(row,col)位置上放皇后合不合法chessboard[row][col] = 'Q'backtracking(n,row+1,chessboard)chessboard[row][col] = '.'
-
这道题还有一个问题就是如何判断(row,col)位置上放皇后合不合法?换言之,就是isValid函数要怎么写?
首先我们来看三个限制条件:
- 不能同行
- 不能同列
- 不能同对角线
这里先给出代码:
def isValid(row,col,chessboard,n):# 检查列 # 细节在于i遍历到row-1即可,因为下面的行还没有确定皇后,所以肯定没有Qfor i in range(row): if chessboard[i][col]=='Q':return False# 检查左上角i = row - 1j = col - 1while i>=0 and j>=0:if chessboard[i][j]=='Q':return Falsei -= 1j -= 1# 检查右上角i = row - 1j = col + 1while i>=0 and j<=n-1:if chessboard[i][j]=='Q':return Falsei -= 1j += 1return True
可以发现几个问题。
- 检查列的时候为什么 for i in range(row) 而不是 for i in range(n)
- 为什么没有检查行
- 为什么没有检查左下角和右下角
因为在该层递归执行时,只确定该行的一个位置,所以不需要检查行,因为该行下只能有一个Q。而且在确定该行时,就表示刚刚执行到该行,下面的行还没有确定Q,所以检查列只需要for i in range(row)即可,而且也不用检查左下角和右下角。
整体代码为:
def solveNQueens(n):result = []chessboard = [ ['.']*n for _ in range(n) ]def isValid(row,col,chessboard,n):# 检查列for i in range(n):if chessboard[i][col]=='Q':return False# 检查左上角i = row - 1j = col - 1while i>=0 and j>=0:if chessboard[i][j]=='Q':return Falsei -= 1j -= 1# 检查右上角i = row - 1j = col + 1while i>=0 and j<=n-1:if chessboard[i][j]=='Q':return Falsei -= 1j += 1return Truedef backtracking(n,row,chessboard):if row == n:temp_res = []for temp in chessboard:temp_str = "".join(temp)temp_res.append(temp_str)result.append(temp_res)returnfor col in range(n):if isValid(row,col,chessboard,n):chessboard[row][col] = 'Q'backtracking(n,row+1,chessboard)chessboard[row][col] = '.'backtracking(n,0,chessboard)return result
2.总结
python
字符列表转字符串:
'''
temp = ['a','b','c','d']
'''
temp_str = "".join(temp)
'''
temp_str = "abcd"
'''