本题要求将给定的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 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

分析:先计算行数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,因为如果螺旋矩阵中所有的元素已经都填充完毕,就不能再重复填充~填充完毕后,输出整个矩阵~

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int cmp(int a, int b) {return a > b;}
int main() {int N, m, n, t = 0;scanf("%d", &N);for (n = sqrt((double)N); n >= 1; n--) {if (N % n == 0) {m = N / n;break;}}vector<int> a(N);for (int i = 0; i < N; i++)scanf("%d", &a[i]);sort(a.begin(), a.end(), cmp);vector<vector<int> > b(m, vector<int>(n));int level = m / 2 + m % 2;for (int i = 0; i < level; i++) {for (int j = i; j <= n - 1 - i && t <= N - 1; j++)b[i][j] = a[t++];for (int j = i + 1; j <= m - 2 - i && t <= N - 1; j++)b[j][n - 1 - i] = a[t++];for (int j = n - i - 1; j >= i && t <= N - 1; j--)b[m - 1 - i][j] = a[t++];for (int j = m - 2 - i; j >= i + 1 && t <= N - 1; j--)b[j][i] = a[t++];}for (int i = 0; i < m; i++) {for (int j = 0 ; j < n; j++) {printf("%d", b[i][j]);if (j != n - 1) printf(" ");}printf("\n");}return 0;
}

1050. 螺旋矩阵(25)-PAT乙级真题相关推荐

  1. 1045. 快速排序(25)-PAT乙级真题

    原题: 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列, ...

  2. 1080. MOOC期终成绩 (25)-PAT乙级真题

    对于在中国大学MOOC(http://www.icourse163.org/)学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评 ...

  3. 1075. 链表元素分类(25)-PAT乙级真题

    给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[0, K]区间内的元素都排在大于K的元素前面.但每一类内部元素的顺序是不能改变的.例如:给定链表为 18→ ...

  4. 1065. 单身狗(25)-PAT乙级真题

    "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数N(<=50000),是已知夫妻/ ...

  5. 1060. 爱丁顿数(25)-PAT乙级真题

    英国天文学家爱丁顿很喜欢骑车.据说他为了炫耀自己的骑车功力,还定义了一个"爱丁顿数"E,即满足有E天骑车超过E英里的最大整数E.据说爱丁顿自己的E等于87. 现给定某人N天的骑车距 ...

  6. 1005. 继续(3n+1)猜想 (25) PAT乙级真题

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

  7. 1015. 德才论 (25)-PAT乙级真题

    题目描述: 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不 ...

  8. 1010. 一元多项式求导 (25)-PAT乙级真题

    设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式 以与 ...

  9. 1020. 月饼 (25)-PAT乙级真题

    月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意: 销售时允许取出一部分库存. ...

最新文章

  1. 【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( Application.mk | APP_ABI := armeabi-v7a arm64-v8a x86 x86_64 )
  2. CodeForces - 618B Guess the Permutation(思维+构造)
  3. java short 后缀_自学java的新手问个问题,为什么写个代码中的int能自动转
  4. mac USB串口工具配置
  5. 数据传输优化篇之:scp 或 rsync+ssh 参数优化
  6. __builtin_apply/__builtin_apply_args
  7. java类包装器有什么用_Java中的包装器类
  8. 一个基于Tp3.2(thinkphp3.2)的工会管理系统
  9. 从中报危机看创业板:谁在兜售“上市经济”?
  10. 开启愉快的路由之旅:广工校园网Wifi
  11. Qpython读取手机短信
  12. flex-warp换行后之间的间隔调整
  13. C++编译动态库第三方库及使用
  14. 淘宝客网站为什么会被腾讯拦截
  15. 华为面试题c/c++
  16. C++ 摄氏温度和华氏温度的转换
  17. videojs 手机端全屏横屏播放
  18. Safari技巧-网页翻译
  19. 喝红茶有什么好处和不好
  20. SCI 文章被拒是一种怎样的体验? - 易智编译EaseEditing

热门文章

  1. Android:自定义滚动边缘(EdgeEffect)效果
  2. Android FrameWork——Activity启动过程详解
  3. django url 中的namespace详解
  4. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)...
  5. 使用Angular与TypeScript构建Electron应用(二)
  6. 吃货少女走关西,美食小店大盘点
  7. 通过反射获取私有方法
  8. install 命令用法详解
  9. 关于jacob支持BSTR类型的经验总结
  10. Wijmo 更优美的jQuery UI部件集:在安全站点使用Wijmo控件