2

マトリックスを左に 90 度回転させているように見える次のコードがあります...

    public static int[,] RotateMatrix(int[,] matrix, int n)
    {
        int[,] ret = new int[n, n];

        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                ret[i, j] = matrix[n - j - 1, i];
            }
        }

        return ret;
    }

どうすれば正しく回転しますか?

4

1 に答える 1

4

さて、示されているスニペットは、実際には時計回り (つまり、右) に回転します... しかし、別の方向に移動したい場合は、座標を交換するだけです:

ret[i, j] = matrix[j, n - i - 1];

少し考えれば、実際には非常に簡単です。次の 4x4 マトリックスがあるとします。

===========================>
| 0,0 | 0,1 | 0,2 | 0,3 | J
| 1,0 | 1,1 | 1,2 | 1,3 |
| 2,0 | 2,1 | 2,2 | 2,3 |
| 3,0 | 3,1 | 3,2 | 3,3 |
=========================
| I
V

そして今、行列を回転させる代わりに、その周りで軸を回転させます:

<===========================
 I | 0,0 | 0,1 | 0,2 | 0,3 |
   | 1,0 | 1,1 | 1,2 | 1,3 |
   | 2,0 | 2,1 | 2,2 | 2,3 |
   | 3,0 | 3,1 | 3,2 | 3,3 |
   =========================
                         J |
                           V

どうなるか見てみ?垂直方向のものは同じままで、名前が (I から J に) 変更されただけです。そして、水平のものは名前が変わっただけでなく、反対側にも行きましたn - j - 1。)

そして、まったく同じマインドトリックが、行列を反時計回りに回転させる公式を理解するのに役立ちます。)

于 2012-11-20T00:51:07.407 に答える