換個角度看問題

閱讀時間約 3 分鐘
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
15會員
131內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
在Python中,所有東西都是物件。執行程式碼a = 5,會建立5這個物件,然後給a一個reference,這個reference就是告訴a,它的值放在記憶體的哪個位置,要用時,就到那裡去拿。 看到這裡,很直覺的反應是:這不就是C裡頭的pointer嗎?!然後就沒再多想了。
comprehension應該可說是Python的絕學之一吧。不過既然是絕學,總是會有讓人容易在運氣時一個不小心走錯經脈的地方。現在我需要一個二維的list,利用comprehension來造一個,應該是再好不過的選擇。只是這地方,就是個容易出錯的地方。
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
在Python中,所有東西都是物件。執行程式碼a = 5,會建立5這個物件,然後給a一個reference,這個reference就是告訴a,它的值放在記憶體的哪個位置,要用時,就到那裡去拿。 看到這裡,很直覺的反應是:這不就是C裡頭的pointer嗎?!然後就沒再多想了。
comprehension應該可說是Python的絕學之一吧。不過既然是絕學,總是會有讓人容易在運氣時一個不小心走錯經脈的地方。現在我需要一個二維的list,利用comprehension來造一個,應該是再好不過的選擇。只是這地方,就是個容易出錯的地方。
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
Thumbnail
現實生活中,宇宙是如此的巨大,然而我們所能看見的生命卻如此的稀有, 這是一個令人困惑的矛盾。 但是,如果生命不僅僅是物質的形式, 那麼生命的數量就不能用現有的觀測方式來衡量。 小時候,我常常做夢,夢見自己變成不知道是什麼波,在黑暗中,沒有任何重力的束縛,往前飛,非常舒服。因此,我不斷思考,或許
乍看之下這很像廢話,沒錯這句也蠻廢的啦,但真的是最重要的,因為有時候你穿越到的世界不見得會是你原本所在世界的平行宇宙, (平行世界講的是跟你生活幾乎一模一樣只在一些事件上有差的世界)
Thumbnail
有時我生活上會被一些小小事給卡住,不知道怎麼做決策時我會做一個練習。 我會幻想成我自己飄到地球的上空,用我的靈魂看著正活在台灣的我會被一些小小事給卡住時,那些事就一點都不重要了,我的人生是要有大景來襯托的,需要去體驗更大格局的事的,否則靈魂怎麼會甘願呢?
Thumbnail
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
遊戲是元宇宙的重要組成部分和試驗場。 在我的構想中,元宇宙可以成為一種綜合應用介面,使人們能夠在三維的環境中,更有效率地完成任務。 想像我們去超市時,自然地掃視貨架找到所需產品。若同樣情形換到網路購物平台,一個貨架的商品可能要分散在多個分頁中。
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
生命是由一長串的工作與選擇組成的,我們不僅需要一個必定能獲得成功的秘訣,我們還需要看穿這個世界的底牌。 而這種從事物的底層、本質出發,尋找解決問題路徑的思維方法,就稱為「底層邏輯」。 我們的一生充其量就是一場「機會的遊戲」。 或許事情不會一直如我們所願,或許計劃總是不如預期,然
Thumbnail
現實生活中,宇宙是如此的巨大,然而我們所能看見的生命卻如此的稀有, 這是一個令人困惑的矛盾。 但是,如果生命不僅僅是物質的形式, 那麼生命的數量就不能用現有的觀測方式來衡量。 小時候,我常常做夢,夢見自己變成不知道是什麼波,在黑暗中,沒有任何重力的束縛,往前飛,非常舒服。因此,我不斷思考,或許
乍看之下這很像廢話,沒錯這句也蠻廢的啦,但真的是最重要的,因為有時候你穿越到的世界不見得會是你原本所在世界的平行宇宙, (平行世界講的是跟你生活幾乎一模一樣只在一些事件上有差的世界)
Thumbnail
有時我生活上會被一些小小事給卡住,不知道怎麼做決策時我會做一個練習。 我會幻想成我自己飄到地球的上空,用我的靈魂看著正活在台灣的我會被一些小小事給卡住時,那些事就一點都不重要了,我的人生是要有大景來襯托的,需要去體驗更大格局的事的,否則靈魂怎麼會甘願呢?
Thumbnail
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件