陣列的出現解決了一次需要宣告過多變數的問題,他將同種型態的東西組合在一起,並利用標準函式庫中的函式對其作為處理。
# 一維陣列
宣告通式:
:::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)
:::