PAT A1105 Spiral Matrix [硬核模拟]

Posted doragd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\n");
    

代码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("\n");
    


以上是关于PAT A1105 Spiral Matrix [硬核模拟]的主要内容,如果未能解决你的问题,请参考以下文章

A1105 Spiral Matrix (25分)

PAT 1105 Spiral Matrix

PAT 1105 Spiral Matrix

PAT1105:Spiral Matrix

PAT 甲级 1105 Spiral Matrix

PAT_A1105#Spiral Matrix