申し出を受賞(19):時計回りのマトリックスを印刷

タイトル説明

16プリントアウト1,234,567,891,011,121,314 15順番:次の4×4行列を入力した場合、例えば、各番号の順番を印刷する時計回りの順に外側から内側へ順に、行列を入力デジタル1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。
 
アイデアの分析:入力マトリックスは、任意の矩形、長さと幅より大きい不確実性であってもよいです。各時間、それぞれ最も外側の出力、出発点の出力、(0,0)、(1,1)、(2,2)···(N、N)... 4つの出力におけるすべてのラップは、排除することが記載します時計方向は、以下:左上→(定数行は、徐々に最大COLに増加)、右↓(COL変わらず、行と徐々に最大まで増加)、低級←(行定数、徐々に最小COLに減少し)、↑ (COL変わらず、行が徐々に最小値に減少します)。変数の辺の数は、出力(row_lengthとCOL_LENGTH)を表し、それは0出力のいずれかが完了したことを意味します。減少サークル各出力は、レンジを超えない、国境に注意を払う必要があります。具体的には、どこの行と列の数だけでなく、現在の座標の変化に注意を払います。
クラス解決{
 パブリック
    ベクトル < INT > printMatrix(ベクトル<ベクトル< 整数 >> 行列){ 
        ベクトル < INT > 結果。
        もし(matrix.empty())
             戻り値の結果; 
        
        INT row_length = matrix.size()。
        もし(row_length == 1 戻り行列[ 0 ]。
        
        INT COL_LENGTH =行列[ 0 ] .size()。
        int型 START_ROW = 0、start_col = 0;
         一方(row_length || COL_LENGTH){
             int型 START_ROW =、= current_colのCURRENT_ROW START_COL;
             
       //毎回出力サークル、座標(0,0)の開始、(1,1)...

       //出力アッパー→ (徐々に最大COLに、一定の行)
のためにINT J = 0 ; J <COL_LENGTH; J ++ ){ result.push_back(行列[のCURRENT_ROW] [current_col ++ ]); } current_col - ; //範囲のうち、によってデクリメント回復 row_length - ; //既に印刷されてライン IF(!row_length)BREAK ; CURRENT_ROWは ++ ; //右上隅から下に移動するグリッドの位置座標
       
       出力右↓(不変COLは、行が徐々に最大まで増加する)// 
ためint型 I = 0 ;私は<row_length; Iは++ ){ result.push_back(行列[current_row ++ ] [current_col]); } current_row - ; //クロスボーダー、リストア COL_LENGTHを - ; //エンド印刷 IF(COL_LENGTH)!BREAK ; current_col -
      不変行(←//下部徐々に最小限に抑えるCOL)
のためのINT J = 0; J <COL_LENGTH。J ++ ){ result.push_back(行列[current_row] [current_col - ])。 } current_col ++ row_length - ; もし(!row_length)ブレーク current_row - ;
       //左↑(COL不变、逐渐减小到最小行)
のためにINT i = 0 ; iはrow_length <; iは++ ){ result.push_back(行列[current_row - ] [current_col])。 } current_row ++ COL_LENGTH - ; IF(COL_LENGTH!)BREAK ;
       次のラップの//開始 START_ROW
++ ; START_COL ++ ; } 返す検索結果を; } };

 

おすすめ

転載: www.cnblogs.com/heifengli/p/11260503.html