日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯day7——DFSBFS

發(fā)布時(shí)間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯day7——DFSBFS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • DFS:深度優(yōu)先搜索
          • 例題
        • BFS: 廣度優(yōu)先搜索
          • 例題
        • 對(duì)于Python中列表切片的補(bǔ)充
        • 總結(jié)

DFS:深度優(yōu)先搜索

  • 其過程簡(jiǎn)要來說是對(duì)每一個(gè)可能的分支路徑深入到不能再深入為止,而且每個(gè)節(jié)點(diǎn)只能訪問一次.
  • DFS自帶回溯,應(yīng)用于枚舉和存在性問題
  • 回溯練得太多了,今天的兩題思路都很簡(jiǎn)單就不多談了

    例題

    給定一個(gè)整數(shù) n,將數(shù)字 1~n 排成一排,將會(huì)有很多種排列方法。

    現(xiàn)在,請(qǐng)你按照字典序?qū)⑺械呐帕蟹椒ㄝ敵觥?/p>

    輸入格式
    共一行,包含一個(gè)整數(shù) n。

    輸出格式
    按字典序輸出所有排列方案,每個(gè)方案占一行。

    數(shù)據(jù)范圍
    1≤n≤7
    輸入樣例:
    3
    輸出樣例:
    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1

    n = int(input())path = [] res = []def backtrace(n, used) :global pathglobal resif len(path) == n :res.append(path[:])returnfor i in range(1, n + 1) :if used[i] :continueused[i] = Truepath.append(i)backtrace(n, used)used[i] = Falsepath.pop()used = [False] * (n + 1)backtrace(n, used)for i in res :for j in i :print(j, end = " ")print()

    值得注意的兩點(diǎn)是

    回溯過程添加結(jié)果集,要用深拷貝
    used數(shù)組False代表在樹枝層面,代表沒用過,True代表用過, 在樹層層面,False代表在同一樹層用過該元素

    n? 皇后問題是指將 n 個(gè)皇后放在 n×n 的國(guó)際象棋棋盤上,使得皇后不能相互攻擊到,即任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上。

    現(xiàn)在給定整數(shù) n,請(qǐng)你輸出所有的滿足條件的棋子擺法。

    輸入格式
    共一行,包含整數(shù) n。

    輸出格式
    每個(gè)解決方案占 n 行,每行輸出一個(gè)長(zhǎng)度為 n 的字符串,用來表示完整的棋盤狀態(tài)。

    其中 . 表示某一個(gè)位置的方格狀態(tài)為空,Q 表示某一個(gè)位置的方格上擺著皇后。

    每個(gè)方案輸出完成后,輸出一個(gè)空行。

    注意:行末不能有多余空格。

    輸出方案的順序任意,只要不重復(fù)且沒有遺漏即可。

    數(shù)據(jù)范圍
    1≤n≤9
    輸入樣例:
    4
    輸出樣例:
    .Q…
    …Q
    Q…
    …Q.

    …Q.
    Q…
    …Q
    .Q…

    import copy n = int(input())graph = [['.'] * n for _ in range(n)]res = []def check(row, col) :global graphglobal nfor i in range(row) :if graph[i][col] == 'Q' :return Falsefor i in range(min(row, col) + 1) :if graph[row - i][col - i] == 'Q':return Falsefor i in range(min(row, n - col - 1) + 1) :if graph[row - i][col + i] == 'Q' :return Falsereturn Truedef dfs(row, n) :global graphglobal resif row == n :res.append(copy.deepcopy(graph))for i in range(n) :if check(row, i) :graph[row][i] = 'Q'dfs(row + 1, n)graph[row][i] = '.' dfs(0, n)for i in res :for j in i :for k in j :print(k, end="")print()print()

    本題樹結(jié)構(gòu):深度是行,寬度是列

    BFS: 廣度優(yōu)先搜索

  • 屬于一種盲目搜尋法,目的是系統(tǒng)地展開并檢查圖中的所有節(jié)點(diǎn),以找尋結(jié)果。換句話說,它并不考慮結(jié)果的可能位置,徹底地搜索整張圖,直到找到結(jié)果為止。
  • 找最優(yōu)解:dp是其中特例
  • 模板
  • queue que #用于寬搜 graph g hash_map[] #用于存每一步的結(jié)果 que.push(root) while len(que) != 0 :q = que.pop()if q exits path : #如果q存在通往下個(gè)節(jié)點(diǎn)的路do something #vertical sngx 題目邏輯,狀態(tài)轉(zhuǎn)移que.push(q)hash_map(graph, q) # 記錄狀態(tài)
    例題

    給定一個(gè) n×m 的二維整數(shù)數(shù)組,用來表示一個(gè)迷宮,數(shù)組中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通過的墻壁。

    最初,有一個(gè)人位于左上角 (1,1) 處,已知該人每次可以向上、下、左、右任意一個(gè)方向移動(dòng)一個(gè)位置。

    請(qǐng)問,該人從左上角移動(dòng)至右下角 (n,m) 處,至少需要移動(dòng)多少次。

    數(shù)據(jù)保證 (1,1) 處和 (n,m) 處的數(shù)字為 0,且一定至少存在一條通路。

    輸入格式
    第一行包含兩個(gè)整數(shù) n 和 m。

    接下來 n 行,每行包含 m 個(gè)整數(shù)(0 或 1),表示完整的二維數(shù)組迷宮。

    輸出格式
    輸出一個(gè)整數(shù),表示從左上角移動(dòng)至右下角的最少移動(dòng)次數(shù)。

    數(shù)據(jù)范圍
    1≤n,m≤100
    輸入樣例:
    5 5
    0 1 0 0 0
    0 1 0 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0
    輸出樣例:
    8

    import collections n, m = map(int, input().split()) que = collections.deque() g = [] d = [[-1] * m for _ in range(n)] for i in range(n) :g.append(list(map(int, input().split())))def BFS() :global g, n, mglobal d, queDIRC = [[-1, 0], [0, 1], [1, 0], [0, -1]]d[0][0] = 0que.appendleft([0, 0])while len(que) != 0 :loc = que.pop()for i in range(4) :x = loc[0] + DIRC[i][0]y = loc[1] + DIRC[i][1]if 0 <= x < n and 0 <= y < m and d[x][y] == -1 and g[x][y] == 0:d[x][y] = d[loc[0]][loc[1]] + 1que.appendleft([x, y]) BFS()print(d[n - 1][m - 1])

    collections模塊下的deque方法,push == appendleft, pop == pop
    對(duì)于遍歷來說可以通過坐標(biāo)來記錄是否遍歷過,矩陣類的圖用[x, y]來確定遍歷的位置,尤其是那些通過上下左右操作的

    在一個(gè) 3×3 的網(wǎng)格中,1~8 這 8 個(gè)數(shù)字和一個(gè) x 恰好不重不漏地分布在這 3×3 的網(wǎng)格中。

    例如:

    1 2 3
    x 4 6
    7 5 8
    在游戲過程中,可以把 x 與其上、下、左、右四個(gè)方向之一的數(shù)字交換(如果存在)。

    我們的目的是通過交換,使得網(wǎng)格變?yōu)槿缦屡帕?#xff08;稱為正確排列):

    1 2 3
    4 5 6
    7 8 x
    例如,示例中圖形就可以通過讓 x 先后與右、下、右三個(gè)方向的數(shù)字交換成功得到正確排列。

    交換過程如下:

    1 2 3 1 2 3 1 2 3 1 2 3
    x 4 6 4 x 6 4 5 6 4 5 6
    7 5 8 7 5 8 7 x 8 7 8 x
    現(xiàn)在,給你一個(gè)初始網(wǎng)格,請(qǐng)你求出得到正確排列至少需要進(jìn)行多少次交換。

    輸入格式
    輸入占一行,將 3×3 的初始網(wǎng)格描繪出來。

    例如,如果初始網(wǎng)格如下所示:

    1 2 3
    x 4 6
    7 5 8
    則輸入為:1 2 3 x 4 6 7 5 8

    輸出格式
    輸出占一行,包含一個(gè)整數(shù),表示最少交換次數(shù)。

    如果不存在解決方案,則輸出 ?1。

    輸入樣例:
    2 3 4 1 5 x 7 6 8
    輸出樣例
    19

    import collectionsstart = "".join(list(input().split()))def BFS(start) :end = "12345678x"DIRC = [[-1, 0], [0, 1], [1, 0], [0, -1]]que = collections.deque()d = {}d[start] = 0que.appendleft(start)while len(que) != 0 :q = que.pop()distance = d[q]tmpq = list(q)if q == end :return distanceindeX = q.index('x')x, y = indeX // 3, indeX % 3for i in range(4) :x1 = x + DIRC[i][0]y1 = y + DIRC[i][1]if (0 <= x1 < 3 and 0 <= y1 < 3) :tmpq[indeX], tmpq[x1 * 3 + y1] = tmpq[x1 * 3 + y1], tmpq[indeX]if d.get("".join(tmpq), -1) == -1 :d["".join(tmpq)] = distance + 1;que.appendleft("".join(tmpq))tmpq[indeX], tmpq[x1 * 3 + y1] = tmpq[x1 * 3 + y1], tmpq[indeX]return -1print(BFS(start))

    注意的點(diǎn):Python中字典的鍵不能為列表,字符串是不可以改變的
    通過字典記錄狀態(tài)

    對(duì)于Python中列表切片的補(bǔ)充

  • 一個(gè)完整的切片表達(dá)式包含兩個(gè)“:”,用于分隔三個(gè)參數(shù)(start_index、end_index、step)。當(dāng)只有一個(gè)“:”時(shí),默認(rèn)第三個(gè)參數(shù)step=1;當(dāng)一個(gè)“:”也沒有時(shí),start_index=end_index,表示切取start_index指定的那個(gè)元素。

  • 切片操作基本表達(dá)式:object[start_index:end_index:step]
    step:正負(fù)數(shù)均可,其絕對(duì)值大小決定了切取數(shù)據(jù)時(shí)的‘‘步長(zhǎng)”,而正負(fù)號(hào)決定了“切取方向”,正表示“從左往右”取值,負(fù)表示“從右往左”取值。當(dāng)step省略時(shí),默認(rèn)為1,即從左往右以步長(zhǎng)1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情說三遍!

  • start_index:表示起始索引(包含該索引對(duì)應(yīng)值);該參數(shù)省略時(shí),表示從對(duì)象“端點(diǎn)”開始取值,至于是從“起點(diǎn)”還是從“終點(diǎn)”開始,則由step參數(shù)的正負(fù)決定,step為正從“起點(diǎn)”開始,為負(fù)從“終點(diǎn)”開始。

  • end_index:表示終止索引(不包含該索引對(duì)應(yīng)值);該參數(shù)省略時(shí),表示一直取到數(shù)據(jù)“端點(diǎn)”,至于是到“起點(diǎn)”還是到“終點(diǎn)”,同樣由step參數(shù)的正負(fù)決定,step為正時(shí)直到“終點(diǎn)”,為負(fù)時(shí)直到“起點(diǎn)”。

  • 總結(jié)

    今天大二學(xué)年的綜測(cè)出來了,說實(shí)話挺慌的,看到我所處的位置,真是搖搖欲墜啊,績(jī)點(diǎn)不穩(wěn)且沒有競(jìng)賽,菜菜子。
    不過這些都急不來,今天看到好多人保研結(jié)果我真是羨慕啊,也期望自己能保到理想的學(xué)校。
    我們要加油,一步一個(gè)腳印,無論結(jié)果如何,千萬別焦慮,別難過,我們都有自己的路要走,加油吧!菜鳥。

    總結(jié)

    以上是生活随笔為你收集整理的蓝桥杯day7——DFSBFS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。