PAT A-1105スパイラルマトリックス(25ポイント)

タイトル:1105スパイラルマトリックス(25ポイント)
分析:シミュレーション、スパイラルアレイ出力
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,k,p;
int cmp(int a,int b)
{
    
    
    return a > b;
}
int a[100001];
int ans[10001][10001];
int main()
{
    
    
    cin>>n;
    for(int i = 1; i<= n; i++)
        cin>>a[i];
    sort(a + 1, a + 1 + n, cmp);
    int rows,cols,t = 999999999;
    for(int i = 1; i <= n; i++)
    {
    
    
        if(n % i == 0 && abs(i - (n / i)) < t)
        {
    
    
            rows = i;cols = n / i; t = abs(i - (n / i));
        }
    }
    if(rows < cols)swap(rows,cols);
    int f = 1;
    int r = 1, c = 1;
    int cnt = 1;
    int left = 1,right = cols,up = 1,down = rows;
    while(cnt <= n)
    {
    
    
        if(f == 1)
        {
    
    
            for(;c<=right;c++)
                ans[r][c] = a[cnt++];
            f = 2;
            up++;
            r++;
            c--;
        }
        else if(f == 2)
        {
    
    
            for(;r<=down;r++)
                ans[r][c] = a[cnt++];
            f = 3;
            right--;
            r--;
            c--;
        }
        else if(f == 3)
        {
    
    
            for(;c>=left;c--)
                ans[r][c] = a[cnt++];
            f = 4;
            down--;
            r--;
            c++;
        }
        else if(f == 4)
        {
    
    

            for(;r>=up;r--)
                ans[r][c] = a[cnt++];
            f = 1;
            left++;
            r++;
            c++;
        }
    }
    for(int i = 1; i <= rows; i++)
    {
    
    
        for(int j = 1;j<=cols;j++)
        {
    
    
            if(j == 1)
                cout<<ans[i][j];
            else
                cout<<" "<<ans[i][j];
        }
        cout<<endl;

    }
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_43567222/article/details/113834397