C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で行列をスパイラル(渦巻き)順に出力する方法|手順とサンプルコードを解説

行列をスパイラル(渦巻き)順に出力するには、外側のリングから順に「最上行 → 最右列 → 最下行 → 最左列」の順で要素を処理し、これをすべての内側の行列がカバーされるまで繰り返します。

スパイラル順に出力する手順

  • ステップ1 − 最上行の要素を左から右へ出力する

  • ステップ2 − 最右列の要素を上から下へ出力する

  • ステップ3 − 最下行の要素を右から左へ出力する

  • ステップ4 − 最左列の要素を下から上へ出力する

  • ステップ5 − 内側の行列が存在する限り、上記の手順を内側のリングに対して繰り返す

コード例

using System;
namespace ConsoleApplication{
    public class Matrix{
        public void PrintMatrixInSpiralOrder(int m, int n, int[] a){
            int i, k = 0, l = 0;
            while (k < m && l < n){
                for (i = l; i < n; ++i){
                    Console.Write(a[k, i] + " ");
                }
                k++;
                for (i = k; i < m; ++i){
                    Console.Write(a[i, n - 1] + " ");
                }
                n--;
                if (k < m){
                    for (i = n - 1; i >= l; --i){
                        Console.Write(a[m - 1, i] + " ");
                    }
                    m--;
                }
                if (l < n){
                    for (i = m - 1; i >= k; --i){
                        Console.Write(a[i, l] + " ");
                    }
                    l++;
                }
            }
        }
    }
    class Program{
        static void Main(string[] args){
            Matrix m = new Matrix();
            int R = 3;
            int C = 6;
            int[] aa = { { 1, 2, 3, 4, 5, 6 },
                          { 7, 8, 9, 10, 11, 12 },
                          { 13, 14, 15, 16, 17, 18 } };
            m.PrintMatrixInSpiralOrder(R, C, aa);
        }
    }
}

出力結果

1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11

アルゴリズムのポイント

この実装では、kl がそれぞれ処理対象となる開始行・開始列のインデックスを、mn が終了行・終了列のインデックスを表しています。各リングの出力が完了するたびに k++n--m--l++ を実行することで、処理範囲を少しずつ内側へと狭めていきます。

また、行または列が1つだけ残ったケース(細長い行列の中心部分など)で同じ要素が二重に出力されるのを防ぐため、if (k < m)if (l < n) の条件チェックを行っている点も重要です。

なお、このアルゴリズムは正方行列(n×n)だけでなく、サンプルのような行数と列数が異なる長方形の行列にもそのまま適用できます。

  1. 【Android】Collections.reverse()を使ってリストの値を逆順に表示する方法

    この記事では、Androidアプリ開発においてCollections.reverse()メソッドを使用して、リストの値を逆順に表示する方法を解説します。ステップ1:新規プロジェクトの作成Android Studioを起動し、File → New Projectを選択して新しいプロジェクトを作成します。必要な項目をすべて入力して、プロジェクトの雛形を生成しましょう。ステップ2:レイアウトファイルの作成次に、res/layout/activity_main.xmlに以下のコードを追加します。<?xml version = "1.0" encoding = "ut

  2. C言語でO(1)の追加メモリ領域のみを使ってn×nのスパイラル行列を出力する方法

    正の整数 n が与えられたとき、追加の作業用メモリを O(1) しか使用せずに、時計回り方向の n×n スパイラル行列を生成して出力する方法を解説します。スパイラル行列とは、円の原点から出発し、時計回りに渦を描くように値を埋めていく行列のことです。ここでは、2 → 4 → 6 → 8 → 10 → 12 → 14 → 16 → 18 というように偶数を渦状に配置した行列を、O(1) の空間計算量で出力することを目標とします。以下にスパイラル行列の例を示します。実行例入力: 3 出力: 9 8 7 2 1 6 3 4 1メモリを無制限に使えばこの問題は簡単に解けますが、そ