背景
rustでatcoderの問題の入力をproconioで行っている。
2次元配列を受け取った後にどう引き出すかをいっつも忘れるのでメモした。
どう考えてもdocument読めばいい話ではあるが・・・
あとatcoderで2次元配列で受け取れと言わんばかりの配列を1次元に落とし込むやり方も。
2次元ベクタに関して
ベクタの要素としてベクタを持つだけである
vec![vec![]]
とすると空のベクタが入った二次元ベクタができる。まずはこの要領で二次元配列と行列の対応付けを行う
\begin{eqnarray}
A=\left(
\begin{array}{ccc}
0 & 1 & 2 \\
3 & 4 & 5 \\
6 & 7&8 \\
\end{array}
\right)
\end{eqnarray}
2次元ベクタでこの行列を表すには以下のように書く
A[i][j] の表記が通常の行列表記に対応している
まずA[i]で定義した外側のベクタを要素を指定してその後中のベクタの要素を指定する
fn main() {
let A =vec![vec![0,1,2],vec![3,4,5],vec![6,7,8]] ;
println!("{:?}",A);
//[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
println!("a00 : {}, a12 : {}, a21 : {}",A[0][0],A[1][2],A[2][1]);
//a00 : 0, a12 : 5, a21 : 7
}
さて、atcoderのproconio。以下のようになる。通常の2次元ベクトルと同様
[usize;m]をCharsとかにすることもある。その場合入力の行にスペースが入っているとエラーがでるので注意
use proconio::{input};
use proconio::marker::{Bytes, Chars};
fn main() {
input!{
n:usize,
m:usize,
A:[[usize;m] ;n],
}
//input 3 2
//0 1
//2 3
//4 5
println!("{:?}",A);
//[[0, 1], [2, 3], [4, 5]]
println!("a00 : {}, a11 : {}, a21 : {}",A[0][0],A[1][1],A[2][1]);
//a00 : 0, a11 : 3, a21 : 5
}
1次元ベクタに関して
2次元ベクタを1次元にするときは以下のようにする。
fn main() {
let A =vec![vec![0,1,2],vec![3,4,5]] ;
let n = 2;
let m = 3;
let mut B = vec![0;n*m];
for i in 0..n{
for j in 0..m{
B[i*m + j] = A[i][j];
}
}
println!("{:?}",B);
//[0, 1, 2, 3, 4, 5]
//戻す
let mut C = vec![vec![0;m];n];
for i in 0..n*m{
C[i/m][i%m] = B[i];
}
}
と思ったら以下でよかった・・・
use proconio::{input};
use proconio::marker::{Bytes, Chars};
fn main() {
input!{
n:usize,
m:usize,
A:[usize ;n*m],
}
//input 3 2
//0 1
//2 3
//4 5
println!("{:?}",A);
//[0, 1, 2, 3, 4, 5]
}
ちなみにusizeをCharsにすると
[['0'], ['1'], ['2'], ['3'], ['4'], ['5']]
となっている。一次元だと間にスペースあってもいけるみたい
Chars の挙動はちょっぴり追記したいかも