Python3 趣味系列題9 ------一筆畫完

0.png

一、問題描述

一筆畫完就是從起始網(wǎng)格開始波附,也就是下圖中錦鯉喵所在的網(wǎng)格,用一筆劃過所有可以走(灰底)的網(wǎng)格昼钻,不能遺漏掸屡,也不能重復(fù)。下圖是微信小游戲一筆畫完第1350關(guān)的題目:

image
image

二然评、解題思路

利用DFS(深度優(yōu)先搜索)和BFS(廣度優(yōu)先搜索)算法找到所有的路徑仅财,利用基于多線程實現(xiàn)的計時器展示尋找路徑所用的時間,最終圖示所有的解碗淌。簡單說下兩個算法的區(qū)別:

  • DFS(Depth First Search)也就是深度優(yōu)先搜索盏求,也就是從起始網(wǎng)格開始,只要是還有可以去的網(wǎng)格亿眠,就一直走下去碎罚,直到走不通為止,然后再回溯到最近的一次選擇缕探,再往下走魂莫,直到遍歷完所有的路徑还蹲。

  • BFS(Breadth First Search)也就是廣度(寬度)優(yōu)先搜索爹耗,也就是從起始網(wǎng)格開始,首先搜索與之相鄰的網(wǎng)格谜喊,然后在搜索與這些網(wǎng)格相鄰的網(wǎng)格潭兽。換句話說,就是逐漸的向周圍擴散搜索斗遏。

兩者利用Python實現(xiàn)的區(qū)別:DFS一般利用遞歸實現(xiàn)山卦,因為涉及到回溯,實現(xiàn)較為復(fù)雜诵次。因為Python中對遞歸函數(shù)有調(diào)用次數(shù)的限制账蓉,因此需要自己實現(xiàn)尾遞歸優(yōu)化枚碗。對于BFS而言,實現(xiàn)比較簡單铸本,但是因為需要保存當前的所有路徑肮雨,當路徑較多時,占用的內(nèi)存空間較大箱玷,因此需要刪除一些不合理的路徑怨规。

從運行時間上而言,獲取一條路徑優(yōu)先選擇DFS锡足,獲取所有路徑BFS好于DFS波丰。但是當可走的網(wǎng)格數(shù)較大時,優(yōu)先選擇DFS舶得,因為BFS可能導(dǎo)致內(nèi)存負載超重掰烟。

image

三、Python3實現(xiàn)

利用numpy的數(shù)組形式來描述問題沐批,也就是不同性質(zhì)的網(wǎng)格給定不同的數(shù)值媚赖,便于繪圖。需要根據(jù)謎題題面珠插,自定義輸入數(shù)組的維數(shù)惧磺,以及起始網(wǎng)格的索引,不可走網(wǎng)格的索引捻撑。根據(jù)這些設(shè)置磨隘,生成相應(yīng)的二維數(shù)組,并利用matplotlib繪制出來顾患。下面以上面的謎題為例番捂,需要進行下面的設(shè)置:

# 豎直、水平方向網(wǎng)格的個數(shù)
Map_Height = 9
Map_Width = 7
# 起始網(wǎng)格和不能經(jīng)過的網(wǎng)格的索引
Start_Index = [1, 0]
Stone_Index = [[0, 3], [0, 6], [1, 6], [2, 6], [3, 1], [7, 1], [8, 3], [8, 5], [8, 6]]
image

上圖為題面的示意圖

image

根據(jù)題面信息繪制的圖江解。

下面說一下對路徑合理性的判斷设预,對于一筆畫完的問題,當走過的網(wǎng)格和不能走的網(wǎng)格犁河,把剩下可以走的網(wǎng)格分為不連通的兩部分時鳖枕,就可判斷當前的路徑是不合理的,也就沒有在這個路徑上繼續(xù)往下搜索的意義桨螺。下圖顯示了加入路徑合理性判斷后的情況對比:

image

關(guān)于兩種算法的實現(xiàn)宾符,尾遞歸的優(yōu)化以及基于多線程的計時器的實現(xiàn),參見代碼注釋灭翔。

考慮到手動輸入題面信息的繁瑣魏烫,還實現(xiàn)了自動讀取謎題照片。當然對照片的質(zhì)量要求較高(屏幕截圖可以(下圖上,第1350關(guān)的題面截圖)哄褒,相機拍攝(下圖下)會有問題)稀蟋。

image
image
image

三、結(jié)果圖示

image
image

第1350關(guān)一共有108條路徑解法呐赡,上圖上展示了基于BFS方法的第16個糊治,上圖下展示基于DFS方法的第108個。獲取所有路徑前者耗時大約105秒罚舱,后者大約186秒井辜。

image

上圖是根據(jù)DFS,獲取的一條路徑以及所用時間管闷。

image
image

上圖上是根據(jù)題面截圖自動讀取出來的結(jié)果粥脚,上圖下是添加路徑后的結(jié)果。因為調(diào)用的是DFS方法包个,所以得到的結(jié)果和上圖是一樣的刷允。

點擊獲得更多趣味謎題。歡迎Follow碧囊,感謝Star!!! 掃描關(guān)注微信公眾號pythonfan树灶,獲取更多。

image
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糯而,一起剝皮案震驚了整個濱河市天通,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熄驼,老刑警劉巖像寒,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓜贾,居然都是意外死亡诺祸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門祭芦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筷笨,“玉大人,你說我怎么就攤上這事龟劲∥赶模” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵咸灿,是天一觀的道長构订。 經(jīng)常有香客問我侮叮,道長避矢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮审胸,結(jié)果婚禮上亥宿,老公的妹妹穿的比我還像新娘。我一直安慰自己砂沛,他們只是感情好烫扼,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碍庵,像睡著了一般映企。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上静浴,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天堰氓,我揣著相機與錄音,去河邊找鬼苹享。 笑死双絮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的得问。 我是一名探鬼主播囤攀,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宫纬!你這毒婦竟也來了焚挠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漓骚,失蹤者是張志新(化名)和其女友劉穎宣蔚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體认境,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡胚委,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叉信。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亩冬。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硼身,靈堂內(nèi)的尸體忽然破棺而出硅急,到底是詐尸還是另有隱情,我是刑警寧澤佳遂,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布营袜,位于F島的核電站,受9級特大地震影響丑罪,放射性物質(zhì)發(fā)生泄漏荚板。R本人自食惡果不足惜凤壁,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跪另。 院中可真熱鬧拧抖,春花似錦、人聲如沸免绿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘲驾。三九已至淌哟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辽故,已是汗流浹背绞绒。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榕暇,地道東北人蓬衡。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像彤枢,于是被迫代替她去往敵國和親狰晚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一、動態(tài)規(guī)劃 找到兩點間的最短路徑业栅,找最匹配一組點的線秒咐,等等,都可能會用動態(tài)規(guī)劃來解決碘裕。 參考如何理解動態(tài)規(guī)劃中携取,...
    小碧小琳閱讀 24,936評論 2 20
  • 花了十幾天,把《算法》看了一遍然后重新 AC 了一遍 LeetCode 的題帮孔,收獲頗豐雷滋。這次好好記錄下心得。我把所...
    VioletJack閱讀 65,176評論 0 77
  • 1. iframe標簽 作用:嵌套界面 可以在嵌套界面里打開指定界面QQ frameborder="0"設(shè)置隱形邊...
    Grit0821閱讀 511評論 0 0
  • 在閱讀一個開源項目或資深的程序員寫的寫得項目,經(jīng)常能看到既寫了@property xxx 又寫了 _xxx的這個實...
    eastCloud閱讀 686評論 0 1
  • 濕冷的陰雨天終于過去了姆坚,今兒個艷陽高照澳泵,再不動動,感覺身體都要發(fā)霉了兼呵。 去哪兔辅?聽說東錢湖有個人不太多的新步道——拜...
    良子LIVE閱讀 1,896評論 0 1