読者です 読者をやめる 読者になる 読者になる

2次元配列の回転

2 次元配列を、時計回り、反時計回りに回転させるプログラムです。

実行例です。

時計回りに回転
0 1 2
3 4 5

3 0
4 1
5 2

5 4 3
2 1 0

2 5
1 4
0 3

反時計回りに回転
0 1 2
3 4 5

2 5
1 4
0 3

5 4 3
2 1 0

3 0
4 1
5 2

プログラム

using System;
using System.Collections.Generic;
using System.Linq;

class Program {   
    static int[,] RotateClockwise(int[,] g) {
        // 引数の2次元配列 g を時計回りに回転させたものを返す
        int rows = g.GetLength(0);
        int cols = g.GetLength(1);
        var t = new int[cols, rows];
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {                
                t[j, rows-i-1] = g[i, j];
            }
        }
        return t;
    }

    static int[,] RotateAnticlockwise(int[,] g) { 
        // 引数の2次元配列 g を反時計回りに回転させたものを返す
        int rows = g.GetLength(0);
        int cols = g.GetLength(1);
        var t = new int[cols, rows];
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) { 
                t[cols-j-1, i] = g[i, j];
            }
        }
        return t;       
    }

    static void Display(int[,] g) {
        int rows = g.GetLength(0);
        int cols = g.GetLength(1);
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (j > 0) Console.Write(' ');
                Console.Write(g[i, j]);
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    }

    static void Main() {
        int[,] g = {
            { 0, 1, 2 },
            { 3, 4, 5 },
        };

        var t = g;
        Console.WriteLine("時計回りに回転"); 
        for (int i = 0; i < 4; i++) {
            Display(t);
            t = RotateClockwise(t);
        }

        t = g;
        Console.WriteLine("反時計回りに回転");
        for (int i = 0; i < 4; i++) {
            Display(t);
            t = RotateAnticlockwise(t);
        }
    }
}