在Ruby中創(chuàng)建二維數(shù)組
以下文章是系列文章的一部分。有關(guān)本系列的更多文章,請參閱在Ruby中克隆游戲2048.有關(guān)完整和最終代碼,請參閱gist。
現(xiàn)在我們知道算法將如何工作,現(xiàn)在需要考慮該算法將使用的數(shù)據(jù)。這里有兩個主要選擇:某種平面陣列或二維陣列。每個人都有自己的優(yōu)勢,但在做出決定之前,我們需要考慮一些因素。
干拼圖
使用基于網(wǎng)格的拼圖的常用技術(shù),您必須尋找類似的圖案,即編寫一個版本的算法,從左到右處理拼圖,然后將整個拼圖旋轉(zhuǎn)四次。這樣,算法只需要寫入一次,只需要從左到右工作。這**降低了該項目中最困難部分的復(fù)雜性和規(guī)模。
由于我們將從左到右研究難題,因此將行由數(shù)組表示是有意義的。當用Ruby制作二維數(shù)組時(或者更準確地說,你希望如何處理它以及數(shù)據(jù)的實際含義),你必須決定你是否需要一堆行(網(wǎng)格的每一行都用一個數(shù)組)或一堆列(每列是一個數(shù)組)。由于我們'重新使用行,我們'將選擇行。
如何旋轉(zhuǎn)這個2D數(shù)組,我們在實際構(gòu)造這樣一個數(shù)組之后,'將會到達。
構(gòu)建二維陣列
這個數(shù)組方法可以引用一個參數(shù)來定義您想要的數(shù)組的大小。例如,數(shù)組(5) 將創(chuàng)建一個5個零對象的數(shù)組。第二個參數(shù)給你一個默認值,所以32數(shù)組(5,0)將給你數(shù)組[0,0,0,0,0]。那么你如何創(chuàng)建一個二維數(shù)組呢?
錯誤的方式,以及我看到的方式人們經(jīng)常嘗試的是說數(shù)組(4,數(shù)組(4,0))。換句話說,4行數(shù)組,每行4個零點數(shù)組。這似乎首先起作用。但是,運行以下代碼:
看起來很簡單。制作一個4x4的零點數(shù)組,將左上角的元素設(shè)置為1。但打印它,我們得到…
它將整個第一列設(shè)置為1,給出了什么?當我們制作數(shù)組時,最里面的調(diào)用是數(shù)組首先被調(diào)用,創(chuàng)建一行。然后將對該行的單個引用重復(fù)4次以填充最外部的陣列。然后每行引用相同的數(shù)組。改變一個,改變它們。
相反,我們需要使用第三種在Ruby中創(chuàng)建數(shù)組的方式。而不是將值傳遞給數(shù)組方法,我們通過一個塊。每次塊被執(zhí)行數(shù)組方法需要一個新的價值。所以,如果你要說數(shù)組(5) {gets.chomp},Ruby將停止并要求輸入5次。所以我們只需要做的就是在這個塊內(nèi)創(chuàng)建一個新的數(shù)組。所以我們最終得到了58數(shù)組(4) {數(shù)組(4,0)}?,F(xiàn)在讓'再次嘗試測試用例。
它就像你所期望的那樣。
所以即使Ruby不支持二維數(shù)組,我們?nèi)匀豢梢宰鑫覀冃枰氖虑椤V恍栌涀?,頂層?shù)組將引用保留給子數(shù)組,每個子數(shù)組應(yīng)該引用不同的值數(shù)組。
這個數(shù)組代表的是你。在我們的例子中,這個數(shù)組被布置成行。第一個索引是我們'行;重新索引開車小知識,從上到下。為了索引難題的第一行,我們使用a[0],向下索引下一行,我們使用a[1]。為了在第二行中索引特定的圖塊,我們使用a[1][n]。但是,如果我們決定專欄……那將是一樣的。Ruby不'不知道我們'正在處理這些數(shù)據(jù),并且因為它不't technically支持二維陣列,我們在這里重新做的是一次攻擊。只能按照慣例訪問它,一切都會保持一致。忘記下面的數(shù)據(jù)應(yīng)該做什么,一切都可以快速分解。