0
0

More than 1 year has passed since last update.

2次元ベクタの取り出し方なんか

Posted at

背景

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 の挙動はちょっぴり追記したいかも

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0