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

    本题要求将给定的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
    

    去年只学了c语言,思维也比较差,时间卡在边上,现在重新想了想,哇,挺简单的啊。


    首先要确定矩阵的长宽,然后一层一层的进行镶嵌

    #include <iostream>
    #include <algorithm>
    using namespace std;
    bool cmp(int a,int b)
    {
        return a>b;
    }
    int se[10000][10000];
    int main()
    {
        int n,ar[10000];
        int res1=0,res2=0,k=0;//必须初始化从0开始
        int a=1,b=1,x,y;
        cin>>n;
        while(a*b!=n)
        {
            a++;
            if(a*b>n)b--;
            else if(a*b<n)b++;
        }//a,b已经确定
        x=a,y=b;//a,b会改变 先记录a,b的值方便最后输出
        #if(0)
        cout<<x<<' '<<y<<endl;
        #endif
        for(int i=0;i<n;i++)
            cin>>ar[i];
        sort(ar,ar+n,cmp);
        while(a>res1&&b>res2)
        {
            for(int i=res2;i<b;i++)
            se[res1][i]=ar[k++];
            if(k==n)break;
            for(int i=res1+1;i<a;i++)
            se[i][b-1]=ar[k++];
            if(k==n)break;
            for(int i=b-2;i>=res2;i--)
            se[a-1][i]=ar[k++];
            if(k==n)break;
            for(int i=a-2;i>res1;i--)
            se[i][res2]=ar[k++];
            if(k==n)break;
            //进行下一圈
            a-=1,b-=1;
            res1+=1,res2+=1;
        }
        for(int i=0;i<x;i++)
            for(int j=0;j<y;j++)
            if(j==y-1)cout<<se[i][j]<<endl;
            else cout<<se[i][j]<<' ';
    }
  • 相关阅读:
    jdk和dubbo的SPI机制
    何谓架构
    ElasticSearch的API使用
    LFU的基本原理与实现
    如何判断单向链表有环?
    mysql执行过程以及顺序
    原来 TinyPNG 可以这样玩!
    deno + mongodb 实战踩坑记
    好消息,vue3.0 进入 beta 阶段!
    听说会做这道题的人后来都进了头条?
  • 原文地址:https://www.cnblogs.com/8023spz/p/7275028.html
Copyright © 2011-2022 走看看