換個角度看問題

更新 發佈閱讀 4 分鐘

Game of Life所設定的世界,是在無窮大的二維平面中。當然啦,寫程式時可沒有「無窮大」這回事,只能侷限在某一個有限的範圍內,必要時,再用平移的方式來處理。

既然是在有限的範圍內,那勢必會有邊界產生,而位於邊界和非邊界的cell,在處理上會有所不同。在檢查某個cell在下一代是不是活著時,必須去數周圍的cell中,有多少個是活著的。對於在universe內部的cell來說,這個不成問題,周圍一定是有8個其他的cell圍繞著。但是對於位於邊界的cell來說,可就不是這麼回事了。以universe[0][0]這個位於左上角邊界的cell來說,周圍的cell只有3個;但對於universe[1][0]這個cell來說,周圍的cell卻有5個。所以啊,在算某個cell周圍有多少活著的cell前,必須先判斷這個cell是不是位於邊界上,而且還要知道是在上、下、左、右、四個角落的哪一個邊界上。

要判斷某個cell是不是位於universe的邊界,其實也不是什麼困難的事,幾個if條件判斷式就解決了。可是啊,程式裡頭有一堆if,看起來還真是挺礙眼的,讓人不開心。除了這種個人的喜好和風格問題外,程式的效率問題也應該考慮一下。使用if來判斷cell是否位於邊界,直球對決,是很直接,不需多花腦筋,但卻很沒效率。那有沒有辦法把那礙眼的if給踢開不用呢?

不用if條件判斷式,就能知道cell是不是位於universe的邊界,看來是沒法做到的。不過,現在的目的是甩掉那一堆礙眼的if,這跟需不需要用if來判斷cell是不是位於邊界,還是有那麼一些不同。如果自始至終,都能保證所有的cell都不是在邊界上,那不是根本就不需要去特別處理邊界問題了嗎?這想法挺誘人的,問題是,怎麼做?

「保證所有的cell都不是在universe的邊界上」,換句話說,就是「保證所有的cell都在universe的內部」囉!這好辦!把universe弄大一些,然後把要處理的部分放中間,這樣就可以了。假設原先的universe高跟寬分別是height和width。現在在周圍,也就是上、下、左、右都加寬一行,變成高和寬分別加大成(height + 2)和(width + 2)。這樣子在高range(1, height+1)和寬range(1, width+1)內的所有cell,就是原來要處理的cell,而這些cell,就都位於這個比較大的universe的內部了。

簡單的一個動作,就把所有的cell從邊界挪到內部,但是啊但是,怎麼知道這樣子不會影響到後面的結果?以原來位在左上角邊界[0][0]這個位置的cell來看,原先周圍的cell有3個,現在被挪到[1][1],所以周圍的cell有8個。換句話說,在數周圍有多少活著的cell時,會多出新增加的5個cell。還好!我們在意的,是周圍有多少活著的cell,多出來的這5個,如果永遠都不是活著的,那就不會有什麼影響了。所以囉,只要設定在原來的universe周圍多加進來的cell不是活著的,而且永遠不會活過來,那就不用擔心會影響到結果了。至於怎樣才能讓這些額外引入的cell永遠不會活過來呢?其實很簡單,就不要理他們就好了!也就是說,只處理高range(1, height+1)和寬range(1, width+1)這個範圍內的cell就好了。

有時候簡單的轉換一下觀點,本來難以解決的問題就會變得簡單許多。把問題從「不使用if來判斷cell是不是位於邊界上」,轉換成「讓所有的cell都不是在邊界上」,就可解決原本看來是沒法解決的問題。寫程式時經常會有卡關的現象,這時候不要一味蠻幹,轉換一下看問題的角度,說不定就能過關。

留言
avatar-img
留言分享你的想法!
avatar-img
ysf的沙龍
19會員
157內容數
寫點東西自娛娛人
ysf的沙龍的其他內容
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News