1050 螺旋矩阵

题意:

结果:

分析:

要仔细读题,题目中已经暗示了做题的方法,那么这就是一类简单模拟题。

这个方法就是:

步骤一,把元素向右一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,就停止填入,转步骤二;

步骤二,把元素向下一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,就停止填入,转步骤三;

步骤三,把元素向左一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,就停止填入,转步骤四;

步骤四,把元素向上一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,就停止填入,转步骤一,

直至N个元素全部填入矩阵。

总结:填入元素的过程,就像是一个一旦碰壁就会改变移动方向的贪吃蛇,并且贪吃蛇的移动轨迹是顺时针方向,如下图,美丽。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

const int maxn = 10010;
int matrix[maxn][110]= {0};//初始化矩阵内的元素全是0
int a[maxn]= {0};
int main() {
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n; ++i)
        scanf("%d",&a[i]);
    sort(a,a+n,greater<int>()); //元素按递减排序
    int column,row,x = 1,y = 0,i = 0;
    for(column = sqrt(n); column>=1; --column) { //这里要始终保证row >= column,不然测试点1,3,7报错
        if(n%column == 0) {
            row = n/column;
            break;
        }
    }
    while(i < n) { //把n个元素填入螺旋矩阵内,(x,y)是填入位置
        while(matrix[x][y+1] == 0 && y+1 <= column)//只要右边有空位并且在矩阵范围内,就填入元素
            matrix[x][++y] = a[i++];
        while(matrix[x+1][y] == 0 && x+1 <= row)//只要下边有空位并且在矩阵范围内,就填入元素
            matrix[++x][y] = a[i++];
        while(matrix[x][y-1] == 0 && y-1 >= 1)//只要左边有空位并且在矩阵范围内,就填入元素
            matrix[x][--y] = a[i++];
        while(matrix[x-1][y] == 0 && x-1 >= 1)//只要上边有空并且在矩阵范围内,就填入元素
            matrix[--x][y] = a[i++];
    }
    for(int i = 1; i <= row; ++i) {
        for(int j = 1; j <= column; ++j) {
            if(j > 1) printf(" ");
            printf("%d",matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

下面附上我第一次做这题时的代码,今昔对比,深有感触。

#include"cstdio"
#include"algorithm"
#include"cmath"
#include"cstring"
using namespace std;

//思路,类似贪吃蛇,按右下左上的顺时针沿着边界向内蜷缩
bool cmp(int a,int b) {
    return a>b;
}

int a[100010];
int d[10010][100]; //默认初始全为0
int main() {
    int N;
    scanf("%d",&N);
    for(int i = 0 ; i < N; ++i)
        scanf("%d",&a[i]);
    sort(a,a+N,cmp);
    int m,n;
    for(int i = (int)sqrt(N); i >=1; --i) {
        n = i;
        if(N%n == 0) {
            m = N/n;
            break;
        }
    }
    int t = 0;//控制方向,开始向右
    bool flag;
    int    i = 1,j = 1;
    int k = 0;
    while(k < N) {
        flag = false;
        if(t%4 == 0) { //向右
            while(d[i][j] == 0 && j <=n) {
                d[i][j] = a[k++];
                ++j;
                flag = true;
            }
            if(flag)
                --j;

            ++i;//准备向下
            ++t;
        }
        if(t%4 == 1) { //向下
            while(d[i][j] == 0&& i <= m) {
                d[i][j] = a[k++];
                ++i;
                flag = true;
            }
            if(flag)
                --i;

            --j;//准备向左
            ++t;
        }
        if(t%4 == 2) { //向左
            while(d[i][j] == 0 && j >=1) {
                d[i][j] = a[k++];
                --j;
                flag = true;
            }
            if(flag)
                ++j;

            --i;//准备向上
            ++t;
        }
        if(t%4 == 3) { //向上
            while(d[i][j] == 0 && i >=1) {
                d[i][j] = a[k++];
                --i;
                flag = true;
            }
            if(flag)
                ++i;

            ++j;//准备向右
            ++t;
        }

    }
    for(int i = 1; i <=m; ++i) {
        for(int j = 1; j <=n; ++j) {
            printf("%d",d[i][j]);
            if(j < n) printf(" ");
        }
        if(i < m)
            printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/keep23456/p/12343221.html

时间: 2024-10-10 12:48:40

1050 螺旋矩阵的相关文章

PAT 1050. 螺旋矩阵

PAT 1050. 螺旋矩阵 本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格.

PTA乙级(*1050 螺旋矩阵 (25分))

1050 螺旋矩阵 (25分) https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608 https://paste.ubuntu.com/p/Dn7fQ9Gf73/ #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cmath>

1050 螺旋矩阵 (25分)

VS2019堆栈溢出---定义了过大的数组,运行程序弹出chkstk.asm的解决方法 用new定义数组 首先要算出合适的m,n--行.列数 附:几个特殊的测试点,输入3个数.27个数.11个数 然后new一个二维数组,将给出的数套进去, i=0;j=0;光标先向右,再向下,再向左,再向上,再向右...如何循环 给出四周的边界数--top = 0, left = -1, right = n, down = m; 再给出当前的轨迹方向-- r = 1, l = 0, up = 0, d = 0;

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

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

PAT-乙级-1050 螺旋矩阵

本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n列,满足条件:m×n 等于 N:m≥n:且 m?n 取所有可能值中的最小值. 输入格式: 输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数.所有数字不超过 104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行 n 个数字,共 m 行.相邻数字以 1 个空格分隔,行末不得有

PAT Basic 1050 螺旋矩阵 (25 分)

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N:m≥n:且 m−n 取所有可能值中的最小值. 输入格式: 输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数.所有数字不超过 1,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行 n 个数字,共 m 行.相邻数字以 1 个空格分隔,行末不得有多余空格. 输入样例: 12 3

pat乙级1050螺旋矩阵

1.用vector建立二维数组: 1 vector<vector<int>> arr(rows); 2 for (int i = 0; i < rows; i++) 3 arr[i].resize(cols); 或: 1 vector<vector<int>> v(m, vector<int>(n)); 2.当数组已初始化但某些下标还未赋值时,此下标对应的变量为NULL(见34行) 代码: 1 #include <iostream&g

2014螺旋矩阵

题目描述 Description 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序,在格子中 依次填入 1, 2, 3, ... , n2,便构成了一个螺旋矩阵. 下图是一个 n = 4 时的螺旋矩阵. 1  2  3  4 12  13  14  5 11  16  15  6 10  9  8  7 现给出矩阵大小 n 以及 i 和