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("
    ");
        }
    
    }
    
    
  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/doragd/p/11385808.html
Copyright © 2011-2022 走看看