zoukankan      html  css  js  c++  java
  • 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 nsatisfy the following: m×n must be equal to N; mn; and mn 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 1. 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
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn = 10010; //数字不能太大 
    int matrix[maxn][maxn],A[maxn];
    
    bool cmp(int a,int b){
        return a > b;
    }
    
    int main(){
        int N;
        scanf("%d",&N);
        for(int i = 0; i < N; i++){
            scanf("%d",&A[i]);
        }
        if(N == 1){
            printf("%d",A[0]);
            return 0;
        }
        sort(A,A+N,cmp);
        int m = (int)ceil(sqrt(1.0*N));
        while(N % m != 0) m++;  //除不整的时候m++ 
        int n = N / m, i = 1, j = 1, now = 0;
        int U = 1, D = m, L = 1, R = n;
        while(now < N){
            while(now < N && j < R){
                matrix[i][j] = A[now++];
                j++;
            }
            while(now < N && i < D){
                matrix[i][j] = A[now++];
                i++;
            }
            while(now < N && j > L){
                matrix[i][j] = A[now++];
                j--;
            }
            while(now < N && i > U){
                matrix[i][j] = A[now++];
                i--;
            }
            U++,D--,L++,R--;
            i++,j++;
            if(now == N - 1){
                matrix[i][j] = A[now++];
            }
        }
        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++){
                printf("%d",matrix[i][j]);
                if(j < n) printf(" "); //j < n,不是j < n - 1 
                else printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    青春小女生 科研大梦想——微软亚洲研究院女实习生的故事
    刷新神经网络新深度:ImageNet计算机视觉挑战赛微软中国研究员夺冠
    优质博士的养成之道——对话2015微软学者奖学金获得者
    洪小文谈科研:自信与谦虚并行
    Java 8 新特性
    Java 实例
    Java 文档注释
    Java Applet 基础
    Java 多线程编程
    Java 发送邮件
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/9574335.html
Copyright © 2011-2022 走看看