陣列的出現解決了一次需要宣告過多變數的問題,他將同種型態的東西組合在一起,並利用標準函式庫中的函式對其作為處理。 # 一維陣列 宣告通式: :::success (型態) 名字[陣列大小]; ::: 以宣告一個裝整數,且大小為3,名為a的陣列為例 ```cpp= int a[3]; ``` 如果我希望他一開始就裝上 $1,1,2$ 可以這樣寫 ```cpp= int a[3]={1,1,2}; ``` 但如果大小為10000,不可能一個一個填吧,所以我們會用memset,他可以指定一個數值並且填充進去(當然,你想用迴圈解決也是可以)。 公式: ```cpp= memset(陣列名稱,你想填入的數值,sizeof(陣列名稱)); ``` 實際應用(以填入0為例): ```cpp= int b[10000]; memset(b,0,sizeof(b))); ``` 在電腦的世界上,都是 ~~(RE)~~ 從零開始,陣列也是,所以我們認為的第1格其實是第0格,每一格的編號我們稱為「索引值」,就像是櫃子的專屬稱號,也可以是畫表格的座標。 :::info 例題 [g275. 1. 七言對聯](https://zerojudge.tw/ShowProblem?problemid=g275) ::: :::info 例題 [a147. Print it all](https://zerojudge.tw/ShowProblem?problemid=a147) ::: :::warning 習題[偏難] [e346. 區間和練習](https://zerojudge.tw/ShowProblem?problemid=e346) [a693. 吞食天地](https://zerojudge.tw/ShowProblem?problemid=a693)[修改輸入版本] 這題因為範圍的關係,所以需要使用long long,可以利用define簡化 原本是這樣 ```cpp= #include<bits/stdc++.h> using namespace std; int main() { } ``` 修改成這樣 ```cpp= #include<bits/stdc++.h> using namespace std; #define ll long long int main() { } ``` 當這樣時可以用ll代表long long 也可以是這樣 ```cpp= #include<bits/stdc++.h> using namespace std; #define int long long signed main() { } ``` 但是這個方式需要將$main$旁的int改成signed,不過這樣就可以使int等於long long int ::: :::warning 習題 [e339. 前綴和練習](https://zerojudge.tw/ShowProblem?problemid=e339)[難題] 這題需要「前綴和」(prefix sum) 所謂前綴和就是用另一個陣列的第$i$項表示某個陣列前$i-1$項的和 $p[0]=0$ $p[1]=a[0]$ $p[2]=a[1]+a[0]$ $p[3]=a[2]+a[1]+a[0]$ $p[4]=a[3]+a[2]+a[1]+a[0]$ $.$ $.$ $.$ $p[n]=a[n-1]+a[n-2]......+a[0]$ $p[n+1]=a[n]+a[n-1]......+a[0]$ 也可以改成 $p[0]=0$ $p[1]=a[0]$ $p[2]=a[1]+p[1]$ $.$ $.$ $.$ $p[n]=a[n-1]+p[n-1]$ $p[n+1]=a[n]+p[n]$ 這樣便可以快速查找指定範圍的總和,例如我需要索引值為0\~3的總和,我只需要輸出$p[4]-p[0]$,我需要1~5,我只需要輸出$p[6]-p[1]$即可。 ::: # 二維陣列 二維陣列簡單來說就是常見的excel表格,描述時是先列(橫)後行(直),實際上除了索引值從0開始以外,與數學上的矩陣是完全相通的。 | a | 0 | 1 | 2 | 3 | | ---- | ---- | ---- | --- | --- | | **0** | 3 | 4 | 10 | 2 | | **1** | 5 | 8 | 7 | 6 | 以上面表格來說,a~01~是4,a~13~是6……以此類推。 宣告通式: :::success (型態) 名字[幾列][幾行]; ::: 以上面那個表格舉例,宣告時會寫 *你會發現,其實就是一維陣列裡面塞陣列而已。* ```cpp= int a[2][4]={{3,4,10,2},{5,8,7,6}}; ``` 如果我要呼叫a~01~,就呼叫a[0][1]就可以了。 *APCS差不多到這裡就有機會實作3了* ## 歷遍 :::warning 習題 [a015. 矩陣的翻轉](https://zerojudge.tw/ShowProblem?problemid=a015) ::: :::warning 習題 [a694. 吞食天地二](https://zerojudge.tw/ShowProblem?problemid=a694) :::