最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)迷宮自動尋路實例

 更新時間:2022年02月08日 14:16:14   作者:程序媛小本  
大家好,本篇文章主要講的是Python實現(xiàn)迷宮自動尋路實例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

背景

我打開手機,發(fā)現(xiàn)有人在QQ空間里叫囂。

看他得意的樣子,顯然是在家里呆久了,已經(jīng)忘了天有多高。

預(yù)處理

設(shè)計一個迷宮自動尋路算法并不難,但是對于當(dāng)下這個任務(wù)而言,第一個棘手的地方在于,如何把這個迷宮變成計算機認(rèn)識的樣子,也就是迷宮圖片的矩陣化。

圖片的大小是397×390。先把四周的白邊裁掉,再把這幅圖中的每一個像素二值化,再根據(jù)顏色賦值,黑色用0表示,白色用1表示,建立一個0/1矩陣??紤]到迷宮的邊界都是封閉的,為了防止由于圖片質(zhì)量問題導(dǎo)致某些看上去是0的地方其實是1,在之后走迷宮的過程中造成一些可預(yù)知的影響,比如列表的越界等,我們再把四條邊上的元素全部強制變成0。這時,對迷宮的預(yù)處理已經(jīng)基本完成,如果我們把1隱藏,把所有的0打印出來,經(jīng)過放縮之后,就得到了這樣的結(jié)果:

尋路算法

得到了這個迷宮矩陣之后,我們需要找到一條從左上角到右下角的路。

印象中我與有關(guān)走迷宮的方法有過一面之緣,那是在一節(jié)算法選修課上,老師在臺上深情地講著深度優(yōu)先搜索與廣度優(yōu)先搜索,我在臺下忘我地抄著大物實驗報告。至今,提起這兩個概念,我唯一的印象只有它倆的英文縮寫一個是D開頭一個是B開頭。

不過沒關(guān)系。當(dāng)年陳刀仔他能用20塊贏到3700萬,我用for循環(huán)搞定這個小迷宮,沒有問題。

一般來說,迷宮的內(nèi)部是不封閉的,我從任意一個地方倒水,總能把整個迷宮填滿。因此,假定我們有一個小老鼠,把它放在起點,如果它能夠保證自動避障、不踩走過的路、遇死胡同回退,那么它總能找到終點。

因此,我們定義一個點(x,y),初始位置為(1,1),也就是邊界內(nèi)左上角的第一個點。

定義兩個列表,一個是path,用來存放它最終確定下來的路徑(也就是那個最終走到終點的路徑)中的每一個點;另一個是footprint,用來存放所有它走過的地方,包括它走的錯路。兩個列表形如[(1,1),(1,2),(2,2),......,(m,n)]。

再定義四種動作,分別是:向下走一步(y=y+1),向右走一步(x=x+1),向左走一步(x=x-1)和向上走一步(y=y-1)。我們每次讓這個點嘗試四種動作,如果能走就讓它走。判斷是否不能走是看下一步的坐標(biāo)是否是墻或者是足跡。把新的點放進pathfootprint里,成為新的足跡。

確定四個動作的優(yōu)先級,即下、右、左、上,能下則下,不能下則右,不能右則左,不能左則上。這樣它就不會在一個空地上平白無故地亂轉(zhuǎn),而是具有一定方向性地探索。

接下來,讓算法具備自動回退的能力。我們想象一個簡單情景:

這個圖不準(zhǔn)確,不滿足本文的優(yōu)先級設(shè)定,但也足以表意

遇到這樣的死胡同,假如進來的時候足跡把出去的路給封死了,那么這個點就沒辦法再出來了。一旦我們發(fā)現(xiàn)這個點陷入了絕境,哪里都不能走了,這時候我們就得讓它原路返回。實迷途其未遠(yuǎn),回到上一個路口也很簡單,無非就是刪掉這一段路線。方法就是把path列表里的最后一個元素逐一彈出列表,由于我們有footprint記錄,所有它走過的地方都不能再走第二遍,所以只要這條錯誤的路沒有完全退出去,退到哪一步都是四個方向都不能走的,因為附近都被它走過了。這樣它就會一直退到我們期望的那個地方,也就是它誤入歧途的那個路口。

測試

下面,我們讓它開始循環(huán)。只要它的坐標(biāo)不等于終點的坐標(biāo),我們就一直讓它不斷地探索。運行結(jié)束后,我們得到了一條迂回的曲線,如圖(局部)。

程序成功得到了一條可以通往終點的路徑,但這條路徑過于冗雜,以上圖為例,所有寬度不為1的地方都是這個點繞來繞去所導(dǎo)致的。因此,該路徑還有待優(yōu)化。

優(yōu)化

我們考慮如下一種簡單情況:

在這條路線中,顯然4~9屬于沒有意義的兜圈,正確的路線應(yīng)該是從3直接到10。

我們的優(yōu)化方法是:如果第n步(x,y),從第n+2步(也就是下一步的下一步),一直到最后一步,這中間只要有一步落在(x,y)一步之遙的地方,就把從第n+1步到這一步的所有路徑點都刪掉。拿上面這個例子來說,我們從第1步開始檢查。檢查到第3步時,我們從第5步開始看,一直看到第10步發(fā)現(xiàn)10落在3一步就能到達的地方,這時我們把中間的4-9全部刪掉,直接把10接在3的后面。

不過,考慮到后面可能還會有更優(yōu)的情況,比如說從12開始繼續(xù)繞,繞到20發(fā)現(xiàn)20剛好落在3的上面,那我們事實上應(yīng)該直接把20接在3后面,12也要丟掉,之前的方法有些缺陷。因此,為了避免這種情況,我們逆著循環(huán),對于第3步而言,我們從第20步往前循環(huán),一直循環(huán)到第5步,看是否有3能直接到達的地方。這樣我們就能對這條路線進行最大優(yōu)化了。

繪制路徑

最終,我們得到了正確而簡潔的路徑,也記錄了曾經(jīng)走過的錯路和多走的路。

根據(jù)矩陣和圖片的對應(yīng)關(guān)系,我們把圖片里對應(yīng)的像素改變顏色,其它點不作更改。

繪制路徑:

優(yōu)化之前:

全部足跡:

結(jié)語

至此,我們已經(jīng)把這個問題解決得差不多了。整個程序在我的電腦上運行下來大概需要三五分鐘這個樣子,畢竟是只用for循環(huán)的暴力方法。

相關(guān)文章

  • python3安裝webssh服務(wù)的操作方法

    python3安裝webssh服務(wù)的操作方法

    在Python中安裝webssh服務(wù),可以使用webssh庫,下面給大家分享python3安裝webssh服務(wù)的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 基于PyQt5制作一個表情包下載器

    基于PyQt5制作一個表情包下載器

    每次和朋友聊天苦于沒有表情包,而別人的表情包似乎是取之不盡、用之不竭。作為一個程序員哪能甘愿認(rèn)輸,所以本文將用Python制作一個表情包下載器供大家斗圖,需要的可以參考一下
    2022-03-03
  • Python對CSV、Excel、txt、dat文件的處理

    Python對CSV、Excel、txt、dat文件的處理

    本文介紹的是Python對CSV、Excel、txt、dat文件的處理,具有一定的參考價值,需要的朋友跟隨小編一起來看下
    2018-09-09
  • Python 注解方式實現(xiàn)緩存數(shù)據(jù)詳解

    Python 注解方式實現(xiàn)緩存數(shù)據(jù)詳解

    這篇文章主要介紹了Python 注解方式實現(xiàn)緩存數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-10-10
  • Python命名空間與作用域深入全面詳解

    Python命名空間與作用域深入全面詳解

    命名空間是從名稱到對象的映射,大部分的命名空間都是通過 Python 字典來實現(xiàn)的,作用域就是一個可以直接訪問命名空間的正文區(qū)域。程序的變量并不是在哪個位置都可以訪問的,訪問權(quán)限決定于這個變量是在哪里賦值的
    2022-11-11
  • Pycharm 安裝 idea VIM插件的圖文教程詳解

    Pycharm 安裝 idea VIM插件的圖文教程詳解

    這篇文章主要介紹了Pycharm 安裝 idea VIM的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Python實現(xiàn)的多線程端口掃描工具分享

    Python實現(xiàn)的多線程端口掃描工具分享

    這篇文章主要介紹了Python實現(xiàn)的多線程端口掃描工具分享,工具實現(xiàn)了掃單IP和掃IP段功能,本文給出運行效果和實現(xiàn)源碼,需要的朋友可以參考下
    2015-01-01
  • 詳解如何使用pandas進行時間序列數(shù)據(jù)的周期轉(zhuǎn)換

    詳解如何使用pandas進行時間序列數(shù)據(jù)的周期轉(zhuǎn)換

    時間序列數(shù)據(jù)是數(shù)據(jù)分析中經(jīng)常遇到的類型,為了更多的挖掘出數(shù)據(jù)內(nèi)部的信息,我們常常依據(jù)原始數(shù)據(jù)中的時間周期,將其轉(zhuǎn)換成不同跨度的周期,下面以模擬的K線數(shù)據(jù)為例,演示如何使用pandas來進行周期轉(zhuǎn)換,感興趣的朋友可以參考下
    2024-05-05
  • Python 利用base64庫 解碼本地txt文本字符串

    Python 利用base64庫 解碼本地txt文本字符串

    這篇文章主要介紹了Python 利用base64庫 解碼本地txt文本字符串的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python文件操作seek()偏移量,讀取指正到指定位置操作

    python文件操作seek()偏移量,讀取指正到指定位置操作

    這篇文章主要介紹了python文件操作seek()偏移量,讀取指正到指定位置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

平南县| 景德镇市| 霍林郭勒市| 莲花县| 交城县| 襄城县| 德昌县| 自治县| 和田市| 阳西县| 黎城县| 泽普县| 延庆县| 资中县| 京山县| 巨鹿县| 贵州省| 新晃| 南漳县| 靖宇县| 临安市| 延边| 大方县| 丹巴县| 榕江县| 湟中县| 乌海市| 永昌县| 共和县| 津市市| 闸北区| 巴塘县| 郴州市| 辽阳市| 瑞丽市| 洛隆县| 石楼县| 永城市| 永年县| 桐城市| 黄山市|