Pat(A) 1105. Spiral Matrix (25)

来源:互联网 发布:h5仿淘宝下拉加载详情 编辑:程序博客网 时间:2024/06/05 15:57

原题目:

原题链接:https://www.patest.cn/contests/pat-a-practise/1105

1105. Spiral Matrix (25)


This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and n columns, where m and n satisfy the following: m*n must be equal to N; m>=n; and m-n is the minimum of all the possible values.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 104. The numbers in a line are separated by spaces.

Output Specification:

For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.

Sample Input:
12
37 76 20 98 76 42 53 95 60 81 58 93
Sample Output:
98 95 93
42 37 81
53 20 76
58 60 76

题目大意

给N个数字,建立一个m行n列矩阵,要求m>=n,且m-n最小。
并将N个数字由大到小排序后由(0,0)按顺时针方向填入矩阵内。

解题报告

对N个数字排序,再建立m*n矩阵。

代码

#include "iostream"#include "math.h"#include "algorithm"#include "vector"using namespace std;int N;vector<vector<int>> G;vector<int> data;int m,n;bool cmp(int a,int b){    return a>b;}void init(){    cin>>N;    int x;    for(int i = 0; i < N; i++){        cin>>x;        data.push_back(x);    }}void cal(){    sort(data.begin(),data.end(),cmp);    m = sqrt(N * 1.0);    while(N % m){        m ++;    }    m = max(m,N/m);    n = N/m;    G.resize(m);    for(int i = 0; i < m; i ++)        G[i].resize(n);}void build_G(){    int k = 0;    int mm = m - 1,nn = n;    int i = 0,j = 0;    while(k<N){        if(nn){            for(int t = 0; t < nn; t++){                G[i][j] = k;                k ++;                j ++;            }            j --;            i ++;            nn--;        }        if(k >= N)            break;        if(mm){            for(int t = 0; t < mm; t++){                G[i][j] = k;                k ++;                i ++;            }            i --;            j --;            mm--;        }        if(k >= N)            break;        if(nn){            for(int t = 0; t < nn; t++){                G[i][j] = k;                k ++;                j --;            }            j ++;            i --;            nn--;        }        if(k >= N)            break;        if(mm){            for(int t = 0; t < mm; t++){                G[i][j] = k;                k ++;                i --;            }            i ++;            j ++;            mm--;        }    }}void print_GData(){    for(int i =0;i<m;i++){        cout<<data[G[i][0]];        for(int j=1;j<n;j++)            cout<<" "<<data[G[i][j]];        cout<<endl;    }}int main(){    init();    if(N == 0){        cout<<data[0]<<endl;        return 0;    }    cal();    print_GData();    system("pause");}