この時間は、あなたの仕事は、一連の埋めるためにある 非増加順にらせん状のマトリックスに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 }