PATグレード--A1105スパイラル行列[25]

この時間は、あなたの仕事は、一連の埋めるためにある  非増加順にらせん状のマトリックスにNは正の整数を。スパイラル行列は時計回りの螺旋状に移動し、その後、左上隅における最初の要素からで充填されています。マトリックスは、有している  m行  ここで、n列の  mおよび  nは以下満たす  M × Nが等しくなければならない  N。 M N。そして  M - N個のすべての可能な値の最小値です。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数を与え  N.は、次の行が含まれている  螺旋マトリックスに充填するNpositive整数。すべての数字は超えないされている  行の1の数字はスペースで区切られます。

出力仕様:

各テストケースのために、出力結果の行列  のm行は、それぞれの内容は  、N個の番号。丁度1つの隣接する二つの数字の間のスペース、および各行の末尾に余分なスペースがなければなりません。

サンプル入力:

12
37 76 20 98 76 42 53 95 60 81 58 93

サンプル出力:

98 95 93
42 37 81
53 20 76
58 60 76

ブロック思考があります
1の#include <iostreamの>
 2の#include <アルゴリズム>
 3の#include <ベクトル>
 4の#include <cmath>
 5  使って 名前空間STDを、
6  int型NN、M、N。
7  INT メイン()
 8  {
 9      CIN >> NN。
10      ベクター< INT > V(NN)。
11      のためには、int型 = Iを0 ; iはNN <; ++ I)
 12          CIN >> V [i]は、
13      N =フロア(SQRT(NN))。// 取小值
14     一方、(!NN%のN = 0)N-。// 找到M、N 
15      、M = NN / N。
16      ベクトル<ベクトル< INT >> ARRY(M、ベクトル< INT >(N、0 ));    
17      ソート(v.begin()、v.end()、[](INT A、INT B){ 戻り > Bを;});
18      INT LM = 0、LN = 0// 左上角
19      INT RM = M - 1、RN = N - 1// 右下角
20      int型のk =0 ; // サフィックスデータを使用
21は     、一方(LM <= RM && LN <= K RN && < NN)
 22である     {
 23は         IF(LM == RM)// 唯一のラインが印刷される
24の             ためのINT I = LN ; I <= RN; ++ I)
 25                  ARRY [LM] [I]は= Vは[Kは++ ];
 26は、         他の IF(LN == RN)// 唯一のカラム
27              のためのINT I = LM; I <= RM。 ++ I)
 28                  ARRY [I] [LN] = V [K ++ ];
 29          他の
30          {
 31れます             INT I = LN、iはRNを<; ++ I)// 上行
32                  ARRY [LM] [i]は= V [++ k個];
33              のためにINT I = LM; iは、RMを<; ++ I)// 右列
34                  ARRY [I] [RN] = V [++ k個];
35              のためにINT I = RN; I> LN; --I)// 下行
36                  ARRY [RM] [i]は= V [++ k個];
37              のためには、int型 I = RMを、I> LM; - I)
 38                  ARRY [i]は[LN] = V [K ++ ]。
39          }
 40         ++ LM、LN ++; // 左上と右下
41である          rm--、rn--; // 左上シフタの右下隅
42である     }
 43である     ためINT I = 0 ; iがm <; ++ I)
 44は     、{
 45          のためにINT = J 0、J <N-; ++ J)
 46は              COUT << ARRY [I] [J] <<(N-J == - 1。 """  " );
 47          COUT << ENDL;
 48      }
 49      リターン 0 ;
 50 }

 

おすすめ

転載: www.cnblogs.com/zzw1024/p/11441585.html