1050. 螺旋矩阵

1050. 螺旋矩阵(25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

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

输入格式:

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

输出格式:

输出螺旋矩阵。每行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
#include<stdio.h>  
#include<math.h>  
#include<stdlib.h>  
int cmp(const void *a, const void *b) {  
    return *(int *)b - *(int *)a;  
}  
  
int main()  
{  
    int N, i,j,k,l, *arr=NULL,mem,meN;  
    int beg, over, men;  
    int m, n;  
    int **pmn=NULL;  
    int lu[2], ld[2], ru[2], rd[2];  
    scanf("%d",& N);  
    arr = (int *)malloc(sizeof(int)*N);  
    for (i = 0; i < N; i++) {  
        scanf("%d", &arr[i]);  
    }  
    qsort(arr, N, sizeof(int), cmp);  
  
    m=(int)sqrt(N);  
    n = m;  
    mem = m;  
    //以平方根为中间值向两边查找m*n大于N时令n-1  
    while ((m*n) != N) {  
        while((m*n )< N&&(m*n) != N) {  
            m++;  
        }  
        if (m*n == N)  
            break;  
        n--;  
        m = mem;  
    }  
    //创建二维数组  
  
      
    pmn = (int **)malloc(sizeof(int *)*m+1);  
    for (i = 0; i < m; i++) {  
        pmn[i] = (int *)malloc(sizeof(int)*n+1);  
    }  
      
    //开始螺旋赋值  
      
    //初始化边界x[0]为行标,x[1]为横着数  
    lu[0] = 0;  
    lu[1] = 0;  
    ru[0] = 0;  
    ru[1] = n - 1;  
    rd[0] = m - 1;  
    rd[1] = n - 1;  
    ld[0] = m - 1;  
    ld[1] = 0;  
    //初始化矩阵行数mem,列数men  
    mem = m;  
    men = n;  
    //初始化数组指针  
    meN = 0;  
  
    while (meN < N) {  
        for (i = lu[0], j = lu[1]; meN < N&&j <ru[1]; j++) {  
            pmn[i][j] = arr[meN++];  
        }  
        //men--;  
        if (lu[0] < ld[0])lu[0]++;  
        else if (lu[0] > ld[0])break;  
        if(lu[1]<ru[1])lu[1]++;  
        //lu[0]++;  
          
        for (i = ru[0], j = ru[1]; meN < N&&i<rd[0]; i++) {  
            pmn[i][j] = arr[meN++];  
        }  
    if( ru[0]<rd[0])ru[0]++;  
    if(ru[1]>lu[1])ru[1]--;  
          
          
        for (i = rd[0], j = rd[1]; meN < N&&j > ld[1]; j--) {  
            pmn[i][j] = arr[meN++];  
        }  
        if (ru[0]<rd[0])rd[0]--;  
        if(rd[1]>ld[1])rd[1]--;  
        for (i = ld[0], j = ld[1]; meN<N&&i>lu[0]-1; i--) {  
            pmn[i][j] = arr[meN++];  
        }  
        if(ld[0]>lu[0])ld[0]--;  
        if(ld[1]<rd[1])ld[1]++;  
  
  
    }  
    for (i = 0; i < m; i++) {  
        for (j = 0; j < n; j++) {  
            if (j != n - 1)  
                printf("%d ", pmn[i][j]);  
            else  
                printf("%d", pmn[i][j]);  
        }  
        printf("\n");  
    }  
  
      
      
      
    free(arr);  
    for (i = 0; i < m; i++) {  
        free(pmn[i]);  
    }  
      
    return 0;  
  
}  

#include <stdio.h>                 //鬼知道怎么过不了  哪位大神能看出错误吗 - -!!!求
#include <stdlib.h>
#include <string.h>
#include <math.h>
void cmp(const void *a, const void *b)
{
  return *((int *)b) - *((int *)a);
}
void Print(int, int, int*);
int main()
{
  int N, m, n, i, j;
  int arr[100000] = { 0 };
  scanf("%d", &N);
  if (N != 0) {
    for (i = 1; i*i<N; i++);
    for (; N%i != 0; i++);
    m = i;
    n = N / m;
  }
  for (i = 0; i < N; i++)
    scanf("%d", &arr[i]);
  qsort(arr, N, sizeof(int), cmp);
  Print(m, n, arr);
}
void Print(int row, int col, int* a)
{
  int **arr;
  int r = 0, c = 0, i, j = 0;
  arr = (int **)malloc(sizeof(int *) *row);
  for (i = 0; i < row; i++)
    arr[i] = (int *)malloc(sizeof(int) * col);
  for (r = 0; r < row; r++)
    for (c = 0; c < col; c++)
      arr[r][c] = 0;
  r = 0, c = 0;
  arr[0][0] = a[j++];
  while (j < row*col)
  {
    while (c < col - 1 && !arr[r][c + 1])  arr[r][++c] = a[j++];
    while (r < row - 1 && !arr[r + 1][c])  arr[++r][c] = a[j++];
    while (c >= 1 && !arr[r][c - 1])   arr[r][--c] = a[j++];
    while (r >= 1 && !arr[r - 1][c])  arr[--r][c] = a[j++];
  }
  for (r = 0; r < row; r++)
  {
    for (c = 0; c < col; c++)
      if (c == col - 1)
        printf("%d", arr[r][c]);
      else
        printf("%d ", arr[r][c]);
    printf("\n");
  }
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值