zoukankan      html  css  js  c++  java
  • 1050. 螺旋矩阵(25)

    1050. 螺旋矩阵(25)
    
    本题要求将给定的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

    分析:首先需要找到最小的m,n。方法是n从1~sqrt(N)尝试取值,如果N能被n整出,则可得m=N/n;再比较m-n与当前最小差值,若更小,则更新m,n和m-n的值。第二个输入数据无序,需要对数据进行排序。最后构造螺旋矩阵,方法是始终朝着一个方向往矩阵中填数,当碰到边界时换方向继续填数,这里的边界是指超出了矩阵范围或者是在当前方向的下一个位置已经填了数。

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    int data[10010];
    int m,n;
    
    bool cmp(int & a,int & b)
    {
        return a>b;
    }
    
    int main()
    {
        int N;
        cin>>N;
        for(int i=0;i<N;i++)
        {
            cin>>data[i];
        }
        //找到合适的m,n
        int min_mn=10010;
        for(int i=1;i<=sqrt(N);i++)
        {
            if(N%i==0&&N/i-i<min_mn)
            {
                m=N/i;
                n=i;
                min_mn=m-n;
            }
        }
        //申请数组内存
        int **arr= new int*[m];
        for(int i=0;i<m;i++)
        {
            arr[i]=new int[n];
            for(int j=0;j<n;j++)
            {
                arr[i][j]=0;
            }
        }
        //降序排序
        sort(data,data+N,cmp);
        //构造螺旋矩阵
        int index=0;
        int i=0,j=0;
        arr[0][0]=data[0];
        index++;
        while(index<N)
        {
            while(j+1<n&&arr[i][j+1]==0)
            {
                arr[i][j+1]=data[index];
                j+=1;
                index++;
            }
            while(i+1<m&&arr[i+1][j]==0)
            {
                arr[i+1][j]=data[index];
                i+=1;
                index++;
            }
            while(j-1>=0&&arr[i][j-1]==0)
            {
                arr[i][j-1]=data[index];
                j-=1;
                index++;
            }
            while(i-1>=0&&arr[i-1][j]==0)
            {
                arr[i-1][j]=data[index];
                i-=1;
                index++;
            }
        }
        //输出结果
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(j!=0)
                {
                    cout<<" ";
                }
                cout<<arr[i][j];
            }
            cout<<endl;
        }
    }
  • 相关阅读:
    Xcode 自定义代码段
    Foundation和CoreFoundation之间的转换
    如何由新特性跳转到App首页
    判断是否是新特性,决定是否进入欢迎页
    iOS面试题01
    公司生日聚会-水长城之游
    jquery操作html元素之(设置内容和属性)
    jquery操作html元素之( 获得内容和属性)
    解决:Map的area属性标签鼠标Hover可以给area加背景
    在网页制作中,面对设计图,网页制作人员一般要遵循的原则是什么?
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6377672.html
Copyright © 2011-2022 走看看