この問題は、所与の必要 記入に従って増加の非整数次のN個の「スパイラルマトリックス」を いわゆる「スパイラルマトリックス」は、時計回りの螺旋方向を充填、グリッドから始まる最初のものの左上隅を指します。必要な行列のサイズ m行の N個の列、条件を満たし:M × Nはに等しい N、M ≥ Nであり;そして M - N個のすべての可能な値の最小値をとります。
入力フォーマット:
入力ライン1は正の整数で与えられているに N、第二列が与えられる 正の整数Nが充填されます。すべての数値を超えない 1は、隣人は、スペースで区切られます。
出力フォーマット:
ヘリカル出力行列。各行 n桁、合計 m個の行。隣人は、スペースで区切られ、行の最後には、余分なスペースを持っていないかもしれません。
サンプル入力:
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
私は個人的には、いくつかのトピック、明確な思考、書き込みが少ないよりも重要であるが、この質問は、モデルをテストするために設計されていることを感じ
、OBJを設計する方法をゲームの小さな主人公に似た動きを、制御された、あなたが上に移動することができますし、ダウン
#include <iostreamの> する#include <cmath> の#include <アルゴリズム> 使用して 名前空間STD; INTデータ[ 10000 ] [ 10000 ] = { 0 }; int型の幅、高さ、 ENUM {Lは、R、U、D} DIR DIRを、// 列挙設定方向 INT X = 0、Y = 0 ; ボイド changedir(){ // 再ルーティング スイッチ(DIR){ ケース L:Uは、DIRを=; BREAK ; ケースU:DIR = R。破ります; ケース R:DIR = D。破ります; ケース D:DIR = 1。破ります; } } 無効アヘッド(){ スイッチ(DIR){ ケースL: もし(X- 1 > = 0 &&データ[X- 1 ] [Y] == 0)x-- 。 他{ changedir()。 先に(); } ブレーク; ケースR: もし(X + 1<幅&&データ[X + 1 ] [Y] == 0)X ++ 。 他{ changedir()。 先に(); } ブレーク; ケースU: もし(Y- 1 > = 0 &&データ[X] [Y- 1 ] == 0)y-- 。 他{ changedir()。 先に(); } ブレーク; ケースD: もし(Y + 1 <高&&データ[X] [Y + 1] == 0)Y ++ 。 他{ changedir()。 先に(); } ブレーク; } } int型のmain() { int型M。 scanf関数(" %のD "、&M)。 int型NUM [M]; 以下のために(int型私= 0 ; iがMを<; I ++)はscanf関数(" %dの"、NUM + I)。 ソート(NUM、NUM + M、大きい< int型 > ()); 以下のための(int型私は=1 ;私は= SQRT(M)を<; I ++の)場合(M%のI == 0)幅= I。 高さ = M / 幅。 もし(幅< 高さ)スワップ(幅、高さ)。 データ[X] [Y] = NUM [ 0 ]; DIR = D。 以下のために(int型 i = 1 ; iがMを<; iは++ ){ 前方()。 データ[X] [Y] = NUM [I]。 } のために(int型 i = 0 ; iは幅<; I ++ ) のための(INT J = 0 ; J <高さ、jは++ ) もし(!J = height- 1)のprintf(" %d個" 、データ[i]は[J]); 他のprintf(" %dは\ nを" 、データ[i]は[J]); システム(「一時停止」)。 リターン 0 ; }