1050 螺旋矩阵

题目描述:

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10000相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 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

解题过程:

首先要得出m和n,然后将存储数据的一维数组排序,按照上,右,下,左的螺旋顺序依次赋值给一个二维数组,再将其输出即可。

代码:

#include
#include
#include
using namespace std;
int mysort(int a,int b){
    return a>b;
}
int main(){
    int N;cin>>N;
    int num[N];
    for(int i=0;i>num[i];
    }
    int m=0,n=0;
    for(int i=1;i<=sqrt(N);i++){
        if(N%i==0){
            n=i;
            m=N/i;
        }
    }
    sort(num,num+N,mysort);
    int a[10000][100];
    int flag=0;
    int up=0,down=m-1;
    int left=0,right=n-1;
    while(true){
        if(flag==N) break;
        for(int i=left;i<=right;i++){
            a[up][i]=num[flag++];
        }
        if(flag==N) break;
        for(int i=up+1;i<=down;i++){
            a[i][right]=num[flag++];
        }
        if(flag==N) break;
        for(int i=right-1;i>=left;i--){
            a[down][i]=num[flag++];
        }
        if(flag==N) break;
        for(int i=down-1;i>=up+1;i--){
            a[i][left]=num[flag++];
        }
        if(flag==N) break;
        up++;
        down--;
        left++;
        right--;
    }
    for(int i=0;i

调试过程:

避免段错误:

if(flag==N) break;
int a[10000][100];

最后一个测试点,开始我觉得100✖100=10000,就设成了a[100][100],报错,我想比如是这样的例子吧:101✖99=9999,但是改成5000,8000啥的也不对。

你可能感兴趣的:(1050 螺旋矩阵)