zoukankan      html  css  js  c++  java
  • PAT A1105 Spiral Matrix [硬核模拟]

    题目描述

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

    分析

    • 方法1:就是按照题意模拟,我自己想到一个切换方向的方法,但是必须初始化的时候要注意!
    • 方法2:while里面套while。内层while有4个,组成了一个整体,即走了一圈,外层while表示不断走圈,直到走完
    • 一直最后一个样例错!!!!!一般都是大样例!!!检查下开的数组,发现没有指定范围!!!
    • 此时!!!用vector!!!
    vector<int> a(N); //一维数组
    vector<vector<int> > b(m, vector<int>(n)); //二维数组!!!有m行,每行是一个n列的一维数组!
    
    • 二维数组初始化
    memset(a, -1,sizeof(a)); //一样的
    

    代码1

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1000;
    int a[maxn][maxn];
    bool v[maxn][maxn];
    const int maxm = 1e4+10;
    int b[maxm];
    int t,m,n;
    
    int main(){
        cin>>t;
        for(int i=1; i<=(int)sqrt(t); i++){
            if(t % i == 0) n = i;
        }
        m = t / n;
        for(int i=0;i<t;i++){
            scanf("%d",&b[i]);
        }
        sort(b,b+t);
        reverse(b,b+t);
        int i = 0, j = -1, nxt = 0, cnt = 0;
        while(cnt < t){
            if(nxt == 0){
                j++;
                if(j>=n || v[i][j]){
                    nxt = (nxt + 1) % 4;
                    j--;
                }else{
                    v[i][j] = 1;
                    a[i][j] = b[cnt++];
                }
            }else if(nxt == 1){
                i++;
                if(i>=m || v[i][j]){
                    nxt = (nxt + 1) % 4;
                    i--;
                }else{
                    v[i][j] = 1;
                    a[i][j] = b[cnt++];
                }
            }else if(nxt == 2){
                j--;
                if(j<0 || v[i][j]){
                    nxt = (nxt+1)%4;
                    j++;
                }else{
                    v[i][j] = 1;
                    a[i][j] = b[cnt++];
                }
            }else{
                i--;
                if(i<0 || v[i][j]){
                    nxt = (nxt+1)%4;
                    i++;
                }else{
                    v[i][j] = 1;
                    a[i][j] = b[cnt++];
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(j!=0) printf(" ");
                printf("%d",a[i][j]);
            }
            printf("
    ");
        }
    
    }
    

    代码2

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e4+10;
    int a[500][500];
    int b[maxn];
    int t,m,n;
    bool cmp(int x, int y){
    	return x>y;
    }
    int main(){
        scanf("%d",&t);
        for(n=sqrt((double)t); n>=1; n--){
            if(t % n == 0){
                m = t / n;
                break;
            }
        }
        for(int i=0;i<t;i++){
            scanf("%d",&b[i]);
        }
        sort(b,b+t, cmp);
        int i = 0, j = 0, cnt = 0;
        memset(a, -1, sizeof(a));
        while(cnt != t){
            while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i][j++]=b[cnt++];
            i++, j--;
            while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i++][j]=b[cnt++];
            i--, j--;
            while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i][j--]=b[cnt++];
            i--, j++;
            while(i>=0&&j>=0&&j<n&&i<m&&a[i][j]==-1&&cnt<t) a[i--][j]=b[cnt++];
            i++, j++;
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(j!=0) printf(" ");
                printf("%d",a[i][j]);
            }
            printf("
    ");
        }
    
    }
    
    
  • 相关阅读:
    money 和 smallmoney
    Sql server decimal 和 numeric
    SQL server数据类型int、bigint、smallint、tinyint
    c# 的传递参数值传递与传递引用的区别,ref与out区别
    释放SQL Server占用的内存
    JavaScript学习总结(一)——JavaScript基础
    js1
    Expected URL scheme 'http' or 'https' but no colon was found
    转载:SpringBoot Process finished with exit code 0
    转载:十大经典排序算法(动图演示)
  • 原文地址:https://www.cnblogs.com/doragd/p/11385808.html
Copyright © 2011-2022 走看看