アルゴリズムⅠ・講義メモ2(新)

1次元配列の2次元変換

・1次元配列[x]に格納されているデータを2次元配列[a,b]にコピーしたい
例: int[] val = {1,2,3,4,5,6} を int[,] val2 = {{1,2,3},{4,5,6}} としたい
・2種類の方法がある
 ① forの2重ループの中で、1次元配列の要素を1個ずつ格納していく
 ② 1次元配列の添字÷bの数を添字aにして、1次元配列の添字÷bの数の余りを添字bにする

1次元配列の2次元変換:方法① arraycopy1

・int[] val = {10,20,30,40,50,60} を int[2,3] val2に格納しよう
・forの2重ループの中で、1次元配列の要素を1個ずつ格納していこう
・格納が終わったら、全件の表示も行うこと

元にすると便利なソース(array6)

int[,] jimi = { {4,8,9},{6,5,3} }; //部屋ごとのモンスター数
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        Console.WriteLine("{0}階{1}号室に{2}匹", i + 1, j + 1, jimi[i,j]); //階と部屋と匹数を表示
    }
}

作成例

int[] val = {10,20,30,40,50,60}; //元の1次元配列
int[,] val2 = new int[2, 3];; //格納先の2次元配列
int idx = 0; //1次元配列の添字用
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        val2[i,j] = val[idx]; //2次元配列の要素に1次元配列[idx]を格納
        idx++; //次の要素へ
    }
}
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        Console.WriteLine("{0}階{1}号室に{2}匹", i + 1, j + 1, val2[i,j]); //階と部屋と匹数を表示
    }
}

1次元配列の2次元変換:方法② arraycopy2

・int[] val = {10,20,30,40,50,60} を int[2,3] val2に格納しよう
・1次元配列の添字÷3の数を添字aにして、1次元配列の添字÷3の数の余りを添字bにする
・これを1次元配列の全要素について繰返せば良い(格納のforループは1重でOK)
・格納が終わったら、全件の表示も行うこと
・つまり:
 val[0] ⇒ val2[0 / 3, 0 % 3] なので val2[0, 0]へ
 val[1] ⇒ val2[1 / 3, 1 % 3] なので val2[0, 1]へ
 val[2] ⇒ val2[2 / 3, 2 % 3] なので val2[0, 2]へ
 val[3] ⇒ val2[3 / 3, 3 % 3] なので val2[1, 0]へ
 val[4] ⇒ val2[4 / 3, 4 % 3] なので val2[1, 1]へ
 val[5] ⇒ val2[5 / 3, 5 % 3] なので val2[1, 2]へ

作成例

int[] val = {10,20,30,40,50,60}; //元の1次元配列
int[,] val2 = new int[2, 3];; //格納先の2次元配列
for (var i = 0; i < 6; i++) { //1次元配列の要素数だけ繰返す
    val2[i / 3, i % 3] = val[i]; //2次元配列の要素に1次元配列[i]を格納
}
for (var i = 0; i < 2; i++) { //階数の分だけ繰返す
    for (var j = 0; j < 3; j++) { //階ごとの部屋の数だけ繰返す
        Console.WriteLine("{0}階{1}号室に{2}匹", i + 1, j + 1, val2[i,j]); //階と部屋と匹数を表示
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です