安全オファー-19を証明するために。時計回り印刷行列(C ++ / Javaの)

トピック:

1,234,567,891,011,121,314 15が順次16プリントアウト:次の4×4行列を入力した場合、例えば、各番号に順次印刷する時計回りの順に外側から内側に向​​かって順に、行列を入力1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10デジタル。

分析:

各デジタルプリントの外から時計回りには、実際には、毎回開始時点から、4つのステップまでを印刷する外輪必要性が印刷するように左から右へ、そして上から下へ、左から右に、特別なケースを検討し、最終的にされていませんその後、下から上への印刷。そして、あなたは、印刷、各印刷完全な円次回の開始座標は、印刷開始点の右下の最後の要素は、ラップの印刷を開始するために[0,0]の位置から始まる、6x6の行列を考慮し、次のスタートです次いで[2,2]、あなたが出発点の座標を知っており、長方形の範囲が印刷したい場合である、あなたが時計回りに印刷することができ、[1,1]から印刷します。

しかしながら、矩形の大きさに応じて、時には4つのステップを印刷するために必要とされません。例えば:

 

 

この行n列の行列、一度だけ印刷しますが、見つけるために、左から右にそのような状況で、あなたは右、一度に左から印刷するために必要なものに関係なく。

場合は、必要に応じて第2のステップは、以下を印刷するには:

 

 

すなわち、行数が1より大きい場合、唯一の第2工程を印刷する必要があります。

第3のステップは右から左への印刷状況を必要とし、次のとおりです。

 

 

簡単には、行と列の数の数が、第3工程を印刷するために必要とされる1つのより大きい必要とされる長方形であることを確認します。

そして、次のように例えば第4工程を印刷します:

 

 

列の数は、第四の工程が必要とされる、請求項2に印刷された行の数よりも大きく1よりも大きいです。

あなたはデジタル外輪を印刷するたびに、あなたは2,3,4の手順を印刷する必要があるかどうかを判断しなければなりません。最後に、長方形を印刷することはもはや必要ではないループの終了条件を記述します。

手順:

C ++

クラス解決{
 パブリック
    ベクトル < INT > printMatrix(ベクトル<ベクトル< 整数 >> 行列){
         場合(matrix.empty())戻りRES。
        INT、M = matrix.size() - 1 ;
        INT、N =行列[ 0 ] .size() - 1 ;
        int型私は= 0を一方、((NI)> = 0 &&(MI)> = 0 ){ 
            readHelper(行列、I、I、M - 、N-- )。
            I ++ ; 
        }
        リターンのres; 
    } 
    ボイド readHelper(ベクトル<ベクトル< INT >>&V、int型のx、int型の Y、INT M、INT N){
         // 左から右へ
        のint I = X。
        int型 J = Y;
        (; J <= N; ++ j)は
            res.push_back(V [I] [J])。
        // 上下に
        あれば(MX> 0 ){
             ため(I = X + 1、J = N; iが<= M; ++ i)が 
                res.push_back(V [I] [J])。
        } 
        // 右に左
        場合(MX> 0 && N - Y> 0 ){
             ため(J = N- 1、I = M; J> = Y; - j)は
                res.push_back(V [I] [J])。
        } 
        // 上下に
        あれば(MX> 1 && N - Y> 0 ){
             ための(iはM- = 1、J = Y; I> X; - I)
                res.push_back(V [I] [J] ); 
        } 
    } 
プライベート
    ベクトル < int型 > のres; 
}。

ジャワ

輸入はjava.util.ArrayList;
パブリック クラスソリューション{
     公共のArrayList <整数> printMatrix(INT [] []行列){ 
        RES = 新規のArrayList <> ();
        もし(matrix.length == 0)の戻りRES。
        INT、M = matrix.length-1 INT、N =行列[0] .LENGTH-1 int型のインデックス= 0 ;
        一方、(M-インデックス> = 0 && Nインデックス> = 0 ){ 
            ヘルパー(マトリックス、インデックス、インデックス、M - 、N-- )。
            インデックス ++; 
        } 
        戻りRES。
    } 
    公共 ボイドヘルパー(INT [] []行列、int型のx、int型 Y、INT ENDX、INT ENDY){
         ためINT J = yであり、j <= ENDY; ++ j)は
            res.add(行列[X] [ J]); 
        もし((ENDX - X)> 0 ){
             ためINT I = X + 1; I <= ENDX; ++ I)
                res.add(行列[I] [ENDY])。
        } 
        もし、((ENDX - - X)> 0 &&(ENDY Y)> 0 ){
             int型 J = ENDY-1; J> = Y。- J)
                res.add(行列[ENDX] [J])。
        } 
        もし、((ENDX - X)> 1 &&(ENDY - Y)> 0 ){
             ためINT ; I> X; I = ENDX-1 - i)は
                res.add(行列[I] [Y])。
        } 
    } 
    プライベートのArrayList <Integer型> のres; 
}

 

おすすめ

転載: www.cnblogs.com/silentteller/p/11918473.html