在Ruby中創(chuàng)建二維數(shù)組

以下文章是系列文章的一部分。有關(guān)本系列的更多文章,請(qǐng)參閱在Ruby中克隆游戲2048.有關(guān)完整和最終代碼,請(qǐng)參閱gist。

現(xiàn)在我們知道算法將如何工作,現(xiàn)在需要考慮該算法將使用的數(shù)據(jù)。這里有兩個(gè)主要選擇:某種平面陣列或二維陣列。每個(gè)人都有自己的優(yōu)勢(shì),但在做出決定之前,我們需要考慮一些因素。

干拼圖

使用基于網(wǎng)格的拼圖的常用技術(shù),您必須尋找類(lèi)似的圖案,即編寫(xiě)一個(gè)版本的算法,從左到右處理拼圖,然后將整個(gè)拼圖旋轉(zhuǎn)四次。這樣,算法只需要寫(xiě)入一次,只需要從左到右工作。這**降低了該項(xiàng)目中最困難部分的復(fù)雜性和規(guī)模。

由于我們將從左到右研究難題,因此將行由數(shù)組表示是有意義的。當(dāng)用Ruby制作二維數(shù)組時(shí)(或者更準(zhǔn)確地說(shuō),你希望如何處理它以及數(shù)據(jù)的實(shí)際含義),你必須決定你是否需要一堆行(網(wǎng)格的每一行都用一個(gè)數(shù)組)或一堆列(每列是一個(gè)數(shù)組)。由于我們'重新使用行,我們'將選擇行。

如何旋轉(zhuǎn)這個(gè)2D數(shù)組,我們?cè)趯?shí)際構(gòu)造這樣一個(gè)數(shù)組之后,'將會(huì)到達(dá)。

構(gòu)建二維陣列

這個(gè)數(shù)組方法可以引用一個(gè)參數(shù)來(lái)定義您想要的數(shù)組的大小。例如,數(shù)組(5) 將創(chuàng)建一個(gè)5個(gè)零對(duì)象的數(shù)組。第二個(gè)參數(shù)給你一個(gè)默認(rèn)值,所以32數(shù)組(5,0)將給你數(shù)組[0,0,0,0,0]。那么你如何創(chuàng)建一個(gè)二維數(shù)組呢?

錯(cuò)誤的方式,以及我看到的方式人們經(jīng)常嘗試的是說(shuō)數(shù)組(4,數(shù)組(4,0))。換句話說(shuō),4行數(shù)組,每行4個(gè)零點(diǎn)數(shù)組。這似乎首先起作用。但是,運(yùn)行以下代碼:

看起來(lái)很簡(jiǎn)單。制作一個(gè)4x4的零點(diǎn)數(shù)組,將左上角的元素設(shè)置為1。但打印它,我們得到…

它將整個(gè)第一列設(shè)置為1,給出了什么?當(dāng)我們制作數(shù)組時(shí),最里面的調(diào)用是數(shù)組首先被調(diào)用,創(chuàng)建一行。然后將對(duì)該行的單個(gè)引用重復(fù)4次以填充最外部的陣列。然后每行引用相同的數(shù)組。改變一個(gè),改變它們。

相反,我們需要使用第三種在Ruby中創(chuàng)建數(shù)組的方式。而不是將值傳遞給數(shù)組方法,我們通過(guò)一個(gè)塊。每次塊被執(zhí)行數(shù)組方法需要一個(gè)新的價(jià)值。所以,如果你要說(shuō)數(shù)組(5) {gets.chomp},Ruby將停止并要求輸入5次。所以我們只需要做的就是在這個(gè)塊內(nèi)創(chuàng)建一個(gè)新的數(shù)組。所以我們最終得到了58數(shù)組(4) {數(shù)組(4,0)}。現(xiàn)在讓'再次嘗試測(cè)試用例。

它就像你所期望的那樣。

所以即使Ruby不支持二維數(shù)組,我們?nèi)匀豢梢宰鑫覀冃枰氖虑?。只需記住,頂層?shù)組將引用保留給子數(shù)組,每個(gè)子數(shù)組應(yīng)該引用不同的值數(shù)組。

這個(gè)數(shù)組代表的是你。在我們的例子中,這個(gè)數(shù)組被布置成行。第一個(gè)索引是我們'行;重新索引開(kāi)車(chē)小知識(shí),從上到下。為了索引難題的第一行,我們使用a[0],向下索引下一行,我們使用a[1]。為了在第二行中索引特定的圖塊,我們使用a[1][n]。但是,如果我們決定專(zhuān)欄……那將是一樣的。Ruby不'不知道我們'正在處理這些數(shù)據(jù),并且因?yàn)樗?t technically支持二維陣列,我們?cè)谶@里重新做的是一次攻擊。只能按照慣例訪問(wèn)它,一切都會(huì)保持一致。忘記下面的數(shù)據(jù)應(yīng)該做什么,一切都可以快速分解。

科普_1