PTAスパイラルマトリックス(25ポイント)

無限の光を放つのは人間の心であり、無限の闇を生み出すのも人間の心であり、光と闇が絡み合って戦うこの世界は、懐かしくて無力な世界です。

今回は、一連のN個の正の整数を、   増加しない順序でらせん行列に入力します。左上隅の最初の要素からスパイラルマトリックスが入力され、時計回りのスパイラルで移動します。行列はm行とn列で構成され、mとnは次の条件を満たす必要があります。m×nmはNに等しい必要があります。m≥n; m-nはすべての可能な値の最小値です。

入力仕様:

各入力ファイルには1つのテストケースが含まれています。いずれの場合も、最初の行は正の整数Nを示します。次に、次の行は、らせん行列に入力されるN個の正の整数を含みます。すべての数値は10 4以下です。行の番号はスペースで区切られます。

出力仕様:

各テストケースについて、結果の行列をm行で出力します。各行にはn個の数値が含まれます。2つの隣接する数値の間に正確に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
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=1000100;
int N,s[10010],mp[10010][10010];
int mi=inf,m,n;
int main(){
    cin>>N;
    for(int i=1;i<=N;i++)
        cin>>s[i];
    sort(s+1,s+1+N);
    for(int i=1;i<=sqrt(N);i++){
        if(N%i==0){
            int ls=i;
            if(abs(ls-N/ls)<mi){
                n=max(ls,N/ls);
                m=min(ls,N/ls);
            }
        }
    }
//    cout<<m<<' '<<n<<endl;
    int x=0,y=1,d=1;
    for(int i=N;i>=1;i--){
        if(d==1){
            x++;
            if(x>m||mp[y][x]!=0){
                d=2;
                x--;
                y++;
            }
        }
        else if(d==2){
            y++;
            if(y>n||mp[y][x]!=0){
                d=3;
                y--;
                x--;
            }
        }
        else if(d==3){
            x--;
            if(x<1||mp[y][x]!=0){
                d=4;
                x++;
                y--;
            }
        }
        else{
            y--;
            if(y<1||mp[y][x]!=0){
                d=1;
                y++;
                x++;
            }
        }
        mp[y][x]=s[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<mp[i][j];
            if(j!=m)
                cout<<' ';
            else
                cout<<endl;
        }
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_44170305/article/details/108526634