【PAT】1105 Spiral Matrix(柳婼的思想详细解读)
【PAT】1105 Spiral Matrix
用的就是是柳大姐的思想:柳姐传送门
先计算行数m和列数n的值,n从根号N的整数部分开始,往前推一直到1,找到第一个满足N % n== 0的,m的值等于N/n~将N个给定的值输入数组a,并将a数组中的值按非递增排序,接着建立m行n列的数组b,填充时按层数填充,一个包裹矩阵的口字型为一层,计算螺旋矩阵的层数level,如果m的值为偶数,层数为m/2,如果m为奇数,层数为m/2+1,所以level = m / 2 + m % 2;因为是从左上角第1个格子开始,按顺时针螺旋方向填充,所以外层for循环控制层数i从0到level,内层for循环按左上到右上、右上到右下、右下到左下、左下到左上的顺序一层层填充,注意内层for循环中还要控制t <= N – 1,因为如果螺旋矩阵中所有的元素已经都填充完毕,就不能再重复填充~填充完毕后,输出整个矩阵~
下面以一个5*4的矩阵为例:(m=5,n=4)
可以看到每一层都需要分为四个步骤进行填充数字。若将元素的下标看成是一个x,y的坐标,我们很容易就可以总结出①②③④遍历过程中x,y的取值范围。其中i表示正在填充第i层,从0开始。
① x:i y:i ~ n-i-1
② x:i+1 ~ m-i-2 y:n-i-1
③ x:m-1-i y:n-i-1 ~ i
④ x:m-i-2 ~ i+1 y: i
在每一轮循环遍历的过程中,我们还需要进行 cnt <= N - 1 的判断(否则会有测试点通不过,例如:只有19个元素,13个元素的时候,大家可以试一试)。其中cnt表示已经填充元素的个数,而N表示元素总个数。
AC代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> v;
int cmp(int a, int b) {return a > b;
}
int main() {int N,m,n; scanf("%d", &N);for (int i = 0; i < N; i++) {int temp; scanf("%d", &temp);v.push_back(temp);}sort(v.begin(), v.end(), cmp);n = (int)sqrt(N);while (N%n) n++;//N%n==0时退出循环m = N / n;if (m < n) swap(n, m);//保持m>=n;vector<vector<int> > ans(m, vector<int>(n));int level = n / 2 + n % 2;//计算一共有几层。int cnt = 0;//记录当前数组的下标for (int i = 0; i < level; i++) {//此时开始遍历每一层for (int j = i; j < n - i && cnt <= N - 1; j++)//①ans[i][j] = v[cnt++];for (int j = i + 1; j < m - i - 1 && cnt <= N - 1; j++) //②ans[j][n - 1 - i] = v[cnt++];for (int j = n - i - 1; j >= i && cnt <= N - 1; j--)//③ans[m - i - 1][j] = v[cnt++];for (int j = m - i - 2; j >= i + 1 && cnt <= N - 1; j--)//④ans[j][i] = v[cnt++];}for (int i = 0; i < m; i++) {cout << ans[i][0];for (int j = 1; j < n; j++) {cout<<" "<< ans[i][j];}cout << endl;}
}
【PAT】1105 Spiral Matrix(柳婼的思想详细解读)相关推荐
- PAT A1105 Spiral Matrix ——黄师塔前江水东,春光懒困倚微风
PAT A1105 Spiral Matrix 转圈圈太可怕,想不出来怎么搞,参考了一下,选择了自己比较容易理解的方案 设置上下左右四个边界值(都是可到达的下标),每次填一圈四条边,然后修改边界值和i ...
- 1105 Spiral Matrix 给定数组向螺旋矩阵中填入数据
两个测试用例超时,可直接跳转到 目录 超时点1 超时点2 要做的事情是,将数组按照非升序/降序,顺时针从外围到内部一圈一圈地把数据填到矩阵中,并打印出来.也就是将数组排好序后,将矩阵的 ...
- 1105 Spiral Matrix (25 分)【难度: 一般 / 知识点: 模拟】
https://pintia.cn/problem-sets/994805342720868352/problems/994805363117768704 又是乙级的原题. #include<b ...
- PAT1105:Spiral Matrix
1105. Spiral Matrix (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue This ti ...
- PAT乙级 1094 谷歌的招聘(柳婼代码,测试点1、2、4、5分析)
从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数. 输入格式: 输入在第一行给出 2 个正整数,分别是 L(不超过 1000 的正整数,为数字长度)和 K(小于 10 的正 ...
- LeetCode:Spiral Matrix I II
Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...
- LeetCode 59 Spiral Matrix II(螺旋矩阵II)(Array)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/5214 ...
- LeetCode Spiral Matrix II (生成螺旋矩阵)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. F ...
- 59. Spiral Matrix II
/** 59. Spiral Matrix II * 12.5 by Mingyang* 注意,这里我们说的Matrix就是正方形,不再是长方形了,所以我们会用* 更简单的方法,就是直接上下左右分别加 ...
- Spiral Matrix I II
Spiral Matrix I Given an integer n, generate a square matrix filled with elements from 1 to n^2 in s ...
最新文章
- 2022-2028中国快时尚服装市场竞争及发展前景预测报告
- 计算程序运行时间(time_t, clock_t)
- python自学路线-Python最佳学习路线
- 划分字母区间(双指针,贪心)
- java.io.IOException: Unable to open sync connection!的解决方案
- C语言中strspn()函数和strcspn()函数的对比使用
- API生态的发展与机遇:从5000组数据看中国API生态与开发者现状
- springmvc的作用:
- 【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [9] 决策树
- 并发编程(十四)—— ScheduledThreadPoolExecutor 实现原理与源码深度解析 之DelayWorkQueue...
- matlab如何求传递函数的幅值_MATLAB通过传递函数求截止频率
- 生活是否永远如此艰辛,还是仅仅童年才如此
- 网页或APP抓包请求参数有什么意思,怎么更快的抓包获取这些请求
- CSS查漏补缺(一)—页面内容不足铺满屏幕高度和有滚动条时,footer始终保持底部显示
- 高位缩量横盘的实战价值
- 电子计算机师德风范 论文,师德师风论文2000字
- ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the clas
- ubuntu 1604 ppa.launchpad.net下载速度慢
- 神经网络的主要应用领域,神经网络发展介绍视频
- 小米科学计算机上的,计算器+