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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

广度优先遍历算法-01寻找制高点问题

發(fā)布時(shí)間:2024/4/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 广度优先遍历算法-01寻找制高点问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

尋找制高點(diǎn)

  • 前言
    • 廣度優(yōu)先遍歷算法在搜索答案時(shí)不像深度優(yōu)先那樣一條路走到底,而是采用由近及遠(yuǎn)的方式,先訪問(wèn)離起始點(diǎn)最近的所有點(diǎn),再訪問(wèn)遠(yuǎn)一些的點(diǎn)。由于這種一層層搜索的策略,又叫做層次遍歷算法。
  • 簡(jiǎn)介
    • 比較基礎(chǔ)的BFS問(wèn)題,但是是很多算法題的模板。
  • 問(wèn)題描述
    • 現(xiàn)在,有一個(gè)矩陣,矩陣的每個(gè)值代表山的高度(均大于1),現(xiàn)在要求找到這個(gè)山的所有制高點(diǎn)。
    • 制高點(diǎn)指的是通過(guò)這個(gè)點(diǎn)可以從上下左右四個(gè)邊界走出去這個(gè)矩陣平面,注意,是四個(gè)邊界都能走出去。
    • 在整個(gè)平面的移動(dòng)規(guī)則是從一個(gè)點(diǎn)只可以向上下左右四個(gè)方向走,并且只能走到不大于自己的值的位置上去。
  • 問(wèn)題分析
    • 這是一個(gè)典型的搜索問(wèn)題,一開始的思路一定是從每個(gè)位置出發(fā)搜索其能否到達(dá)四個(gè)邊緣。很顯然,對(duì)矩陣的每個(gè)值都要進(jìn)行這樣的搜索,顯然,這樣有些費(fèi)時(shí)了。(如果在LeetCode上,這就是Exceed Time Limit報(bào)錯(cuò))
    • 那么,如何優(yōu)化算法呢?
      • 這條思路不行,那么就換一個(gè)思路處理問(wèn)題,既然從每個(gè)點(diǎn)走向邊緣的搜索有些低效,那么不妨以邊緣的所有點(diǎn)為起點(diǎn)向內(nèi)部進(jìn)行搜索,看下一個(gè)節(jié)點(diǎn)是否不小于自己的值(這和下山的規(guī)則相反)。
      • 標(biāo)記能夠到達(dá)的點(diǎn)為True,繼續(xù)搜索,直到不能走為止。按照這樣的思路,標(biāo)記四個(gè)邊界可以到達(dá)的點(diǎn),都為True的點(diǎn)為制高點(diǎn)。(也就是四個(gè)集合的交集)
      • 這就是典型的逆向思維,算法中經(jīng)常要求這種逆向思維。
    • 為了獲取每個(gè)點(diǎn),定義每個(gè)點(diǎn)的坐標(biāo)為四個(gè)集合的記錄值。
  • 代碼
    • # -*-coding:utf-8-*-def bfs(set_data, m, n, matrx):dir = [[0, 1], [0, -1], [1, 0], [-1, 0]]queue = list(set_data)while queue:x, y = queue.pop()for d in dir:nx, ny = x + d[0], y + d[1]if 0 <= nx < m and 0 <= ny < n:if matrix[nx][ny] >= matrix[x][y]: # 如果新點(diǎn)不低于自己則可以走if (nx, ny) not in set_data:queue.append((nx, ny))set_data.add((nx, ny))def solve(matrix):"""典型的BFS:return:"""m = len(matrix)n = len(matrix[0])top_point = set([(0, y) for y in range(n)])bottom_point = set([(m-1, y) for y in range(n)])left_point = set([(x, 0) for x in range(m)])right_point = set([(x, n-1) for x in range(m)])bfs(top_point, m, n, matrix)bfs(left_point, m, n, matrix)bfs(bottom_point, m, n, matrix)bfs(right_point, m, n, matrix)result = top_point & left_point & right_point & bottom_pointreturn resultif __name__ == '__main__':matrix = [[1, 3, 2, 3, 5],[3, 4, 5, 6, 3],[2, 7, 4, 3, 3],[5, 2, 2, 3, 1]]print(solve(matrix))
  • 運(yùn)行結(jié)果
  • 補(bǔ)充說(shuō)明
    • 具體代碼可以查看我的Github,歡迎Star或者Fork
    • 參考書《你也能看得懂的Python算法書》

總結(jié)

以上是生活随笔為你收集整理的广度优先遍历算法-01寻找制高点问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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