ソース:
説明:
この時間は、あなたの仕事は、一連の埋めるためにある 非増加順にらせん状のマトリックスにNは正の整数を。スパイラル行列は時計回りの螺旋状に移動し、その後、左上隅における最初の要素からで充填されています。マトリックスは、有している m行 ここで、n列の mおよび nは以下満たす M × nmustに等しいこと N。 M ≥ N。そして M - N個のすべての可能な値の最小値です。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数与える そしてNを次の行が含まれている Nの正の整数で螺旋状マトリックスに充填します。すべての数字は超えないされている 行の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
キー:
- シンプルなシミュレーション
注意:
- 基本的な考え方は、降順に順次充填されたマトリックスを配列決定することです。
- ダイレクトオープンは1E4行列メモリを超え、より大きなM、Nサンプルの存在小さいので、代わりに一次元アレイの二次元アレイを使用します
- 決意PT <Nのために必要な循環ループ内の4つの
コード:
1 / * 2 のデータ:2019年6月8日午後4時12分47秒 3。 問題:スパイラル#PAT_A1105マトリックス 。4 AC:1時05分29秒 。5 6。 影響を受ける: 7 配列降順時計回り行列に 8 * / 9の#include <機能> 10の#include <cstdioを> 11の#include <cmath> 12であるの#include <アルゴリズム> 13で 使用し た名前空間STD; 14 のconst int型 M + 1E4 = 10 ; 15 INT 行列[M]、A [M] ; 16 。17 INT メイン() 18である { 19。 #ifdefのONLINE_JUDGE 20 の#else 21 freopenは(" Test.txtを"、" R " 、STDIN)。 22 #endifの 23 24 INT N、N、M。 25 のscanf(" %dの"、&N)。 26 のためには、(int型 i = 0 ; iがNを<; iは++ ) 27 のscanf(" %dの"、および[I])。 28 のために(int型 iは=(INT)SQRT((二重)N)、I> =1 ; i-- ) 29 { 30 であれば(N%I == 0 ) 31 { 32 N = I。 33 、M = N / I。 34 ブレーク; 35 } 36 } 37 ソート(+ N、大きな< INT > ()); 38 充填(マトリックス、マトリックス+ M、0 ); 39 INT PT = 0、C = 1、R = 1、R = M、C = N。 40 一方(PT < N) 41 { 42 のための(int型私は、C =、私は、Pt <N <= N &&; iが++ ) 43 行列[C * R- 2 + I- 1 ] [++ PT = ]。 44 R ++ 。 45 のためには、(int型 = rはIを、I <= M && PT <N; I ++ ) 46 行列[C * I- 2 + N- 1 ] = [++ PT ]。 47 N - ; 48 のために(int型 ; I> = C && PT <N i-- I = N ) 49 行列[C * M- 2 + I- 1] = [PT ++ ]。 50 M-- ; 51 のためには、(int型 I = mを、I> = R && PT <N; i-- ) 52 マトリックスは[CのI- * 2 + C- 1 ] = [++ PT ]。 53個の C ++ ; 54 } 55 のための(int型 I = 1 ; I <= R; I ++ ) 56 のための(INT J = 1 ; J <= C; J ++ ) 57 のprintf(" %d個の%のC "、行列[C * I- 2 + J- 1]、J == C?' \ nを':' ' ); 58 59 60 リターン 0 ; 61 }