数据结构与算法(Python)– 回溯法(Backtracking algorithm)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法(Python)– 回溯法(Backtracking algorithm)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據結構與算法(Python)– 回溯法(Backtracking algorithm)
1、回溯法
回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇并不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。采用的是深度優先搜索。
2、迷宮
題目: 一個 N × M的二維數組 maze 表示一個迷宮,其中的1表示墻壁,0表示可以走,只能橫著走或豎著走,不能斜著走,找出從左上角到右下角的最短路線。入口點為[0,0],既第一空格是可以走的。
回溯法:
# 走迷宮 def move(i, j):global path# 當前點變為1,表示已經走過,避免循環繞圈走不出去maze[i][j] = 1temp_path.append((i, j))# 如果已經走到了出口,即右下角,判斷是不是最短路徑if i == N - 1 and j == M - 1:if len(path) == 0 or len(temp_path) < len(path):path = []path.extend(temp_path)# 向下走if 0 <= i + 1 < N and not maze[i + 1][j]:move(i + 1, j)# 向右走if 0 <= j + 1 < M and not maze[i][j + 1]:move(i, j + 1)# 向上走if 0 <= i - 1 < N and not maze[i - 1][j]:move(i - 1, j)# 向左走if 0 <= j - 1 < M and not maze[i][j - 1]:move(i, j - 1)# 如果上下左右都走不通或者已經走到出口了,退回上一步,恢復現場temp_path.pop()maze[i][j] = 0while True:try:# 輸入迷宮大小N, M = map(int, input().split())maze = []path = []temp_path = []# 輸入迷宮地圖for _ in range(N):maze.append(list(map(int, input().split())))# 走迷宮move(0, 0)# 打印路徑for p in path:print('(' + str(p[0]) + ',' + str(p[1]) + ')')except:break3、數獨
題目: 根據9X9網格上的已知數字,推算出所有剩余空格的數字,并且滿足每一行、每一列、每一個3X3網格內的數字均含1-9,并且不重復。
回溯法:
# 檢查該位置填該數字是否滿足要求 def check(m,n,e):# 檢查行if e in s[m]:return False# 檢查列if e in s_T[n]:return False# 檢查3X3網格x=m//3*3y=n//3*3for i in range(x,x+3):for j in range(y,y+3):if s[i][j]==e:return Falsereturn True# 填數字 def move(k):if k==81:return 0# 從左到右,從上到下遍歷每一格row,col=k//9,k%9# 如果是該格為空if s[row][col]=='0':# 從1~9依次嘗試for e in num:# 如果該數滿足要求,該格填上該數if check(row,col,e):s[row][col]=es_T[col][row]=e# 移到下一格。如果下一格不管填什么都不滿足要求,恢復現場if move(k+1):s[row][col]='0's_T[col][row]='0'else:return 0# 如果1~9都不滿足,返回1return 1else:if move(k+1):return 1while True:try:# 輸入s=[input().split() for i in range(9)]s_T=[[s[i][j] for i in range(9)] for j in range(9)]num=['1','2','3','4','5','6','7','8','9']# 填數字move(0)# 打印for i in range(9):print(' '.join(s[i]))except:breakGOOD LUCK!
總結
以上是生活随笔為你收集整理的数据结构与算法(Python)– 回溯法(Backtracking algorithm)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用js拼html写下拉框,js实现下拉框
- 下一篇: Error running tomcat