美文网首页
PAT-B 1050. 螺旋矩阵(25)

PAT-B 1050. 螺旋矩阵(25)

作者: Rush的博客 | 来源:发表于2016-10-22 01:24 被阅读564次

传送门

https://www.patest.cn/contests/pat-b-practise/1050

题目

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过10^4,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行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

分析

我们先进行题目分析,先分解成一个个小问题,然后逐个击破:
1.先按倒序排列数组:
用algorithm里面的sort或者stdlib.h中的qsort都可以,但是qsort不能排vector,因为地址不连续,这个要注意一下。要自己写campare方法就行,默认是升序的。
2.根据输入的数组个数,求出矩阵的行数和列数:
这个方法有很多了,我用的就是对N开根的值开始,逐渐减到1,求m和n,别的方法也行。
3.螺旋放置:
这个是难点,我开始声明了变量status来确定是怎样放置的,一共有四种:左->右,上->下,右->左,下->上,然后针对不同的status对坐标有相应的自增或自减方法,并且如果这一行如果被放置过了,要给放置的次数做减1的操作。

注意:我想到的螺旋放置方法不适用于只有一列的情况,要单独判断这种情况,单独写输出方法。

源代码

//C/C++实现
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

bool compare(int a, int b){
    return a > b; //desc
}

int main(){
    int N;
    scanf("%d", &N);
    vector<int> v(N);
    for(int i = 0; i < N; ++i){
        scanf("%d", &v[i]);
    }
    //sort
    sort(v.begin(), v.end(), compare);
    //calculate m and n
    int i = sqrt((double)N);
    int m, n;
    for(; i >= 1; --i){
        if(N % i == 0){ //整除
            n = i;
            m = N / n;
            break;
        }
    }
    int a[m][n]; //一会改成a[m][n]
    int x = 0, y = -1;
    int status = 0; //从左向右是0,上向下是1,右向左是2,下向上是3
    int c0 = 0, c1 = 0, c2 = 0, c3 = 0; //走过该路径就自增1
    if(n == 1){
        for(int i = 0; i < v.size(); ++i){
            printf("%d\n", v[i]);
        }
    }
    else{
        for(int i = 0; i < v.size(); ++i){
            if(status == 0){
                ++y;
                if(y == n - 1 - c1){
                    status = 1; //该从上往下填充了
                    ++c0;
                }
            }
            else if(status == 1){
                ++x;
                if(x == m - 1 - c2){
                    status = 2; //该从右往左填充了
                    ++c1;
                }
            }
            else if(status == 2){
                --y;
                if(y == 0 + c3){
                    status = 3; //该从下往上填充了
                    ++c2;
                }
            }
            else if(status == 3){
                --x;
                if(x == 0 + c0){ //该从左往右填充了
                    status = 0;
                    ++c3;
                }
            }
            a[x][y] = v[i];
        }
        for(int i = 0; i < m; ++i){
            for(int j = 0; j < n; ++j){
                if(j == 0){
                    printf("%d", a[i][j]);
                }
                else{
                    printf(" %d", a[i][j]);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

相关文章

  • PAT-B 1050. 螺旋矩阵(25)

    传送门 https://www.patest.cn/contests/pat-b-practise/1050 题目...

  • PAT Basic 1050. 螺旋矩阵(25)(C语言实现)

    我的PAT系列文章更新重心已移至Github,欢迎来看PAT题解的小伙伴请到Github Pages浏览最新内容。...

  • Python实现螺旋矩阵

    螺旋矩阵 什么是螺旋矩阵? 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大...

  • 1050 螺旋矩阵 (25 分)

  • 螺旋矩阵

    螺旋矩阵 1.想法: 对于矩阵的螺旋我们可以规约为4个方向 2.代码:

  • PAT甲级A1105---快乐模拟

    1105 Spiral Matrix (25分) 分析: 将N个数逆时针螺旋填入矩阵中,由于行数m * 列数n 要...

  • 螺旋矩阵

    递归 非递归

  • 螺旋矩阵

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1...

  • 螺旋矩阵

    题目描述:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。...

  • 螺旋矩阵

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1...

网友评论

      本文标题:PAT-B 1050. 螺旋矩阵(25)

      本文链接:https://www.haomeiwen.com/subject/vkumyttx.html