这道题折腾了好久,最后发现不是二维矩阵的相关问题,而是一个很简单的小问题

接下来为列出遇到的各种问题,并逐个分析

本题涉及的新知识点:

1.关于c语言函数在c++中的调用(头文件)

#include<cstdio>

cstdio: 将stdio.h的内容用c++的头文件形式表现出来

标准输入输出:standard buffered intput&&output

2.二维数组的动态建立与快速排序

动态建立:

先创建二维指针,并申请第一维的动态空间(所申请空间储存的数据类型: int*)

=> 通过第一次循环,为第二维申请动态空间(所申请空间储存的数据类型: int)

=> 通过第二次循环,对最终的二维变量完全体进行操作

int** num = new int* [a];
for (int i = 0; i < a; i++) {num[i] = new int[b];for (int j = 0; j < b; j++) {cin >> num[i][j];}
}

此外,还可以使用vector容器及头文件#include<vector>附带的函数进行二维数组的动态建立

快速排序:

一般遇到使用sort函数,都是一维数组

sort函数的语法: sort(taget.begin(), taget.end(), cmp);

对象为二维数组时:

int cmp(int a, int b) {return a > b;
}sort(num, num + n, cmp);

本题需求为降序排序,而sort函数默认为升序排序,在不使用c++模板函数great<int>less<int>的情况下,使用自定义函数cmp来控制数组升降

对比显然可得,二维与一维在快速排序上,命令基本雷同

编译与调试过程遇到的问题:

1.一维数组储存数列,并使用二维数组对数值位置进行处理

遇到的问题:处理代码及二维数组动态建立

2.格式问题   主要集中在测试点1 3 7

这个困扰很久,可能那天脑子瓦特了(对以后复习的自己来说,就是那天了(灬°ω°灬) )

以下附上错误代码:

#include<iostream>
using namespace std;
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
int cmp(int a, int b) {return a > b;
}
int main() {int n;cin >> n;int a = 0, b = 0;//行与列的计算  错误出现在这里for (int i = sqrt(double(n)) + 1; i > 0; i--) {if (n % i == 0) {//错误原因:如果那个可以被整除的i是1,那么break后,a=i(小),显然不符合行大于列的要求//从而造成格式错误a = i;b = n / i;break;}}//一维数组的建立,用于储存数据和第一次快排int* num = new int[n];for (int i = 0; i < n; i++) {cin >> num[i];}sort(num, num + n, cmp);//二维数组的建立,用于提取一维数组数据和螺旋矩阵的位置布置int** num1 = new int* [a];for (int i = 0; i < a; i++) {num1[i] = new int[b];for (int j = 0; j < b; j++) {num1[i][j] = 0;}}//排兵布阵的核心代码命令int x = 0, y = 0;num1[0][0] = num[0];int k = 0;while (k < n - 1) {while (y + 1 < b && !num1[x][y + 1] && k < n - 1) {num1[x][++y] = num[++k];}while (x + 1 < a && !num1[x + 1][y] && k < n - 1) {num1[++x][y] = num[++k];}while (y > 0 && !num1[x][y - 1] && k < n - 1) {num1[x][--y] = num[++k];}while (x > 0 && !num1[x - 1][y] && k < n - 1) {num1[--x][y] = num[++k];}}//将命令结果呈现到显示屏上for (int i = 0; i < a; i++) {for (int j = 0; j < b; j++) {cout << num1[i][j];if (j != b - 1) {cout << " ";}}cout << endl;}
}

错误信息:

 错误代码提取及改进:

错误代码提取:

//行与列的计算  错误出现在这里
for (int i = sqrt(double(n)) + 1; i > 0; i--) {if (n % i == 0) {//错误原因:如果那个可以被整除的i是1,那么break后,a=i(小),显然不符合行大于列的要求//从而造成格式错误a = i;b = n / i;break;}
}

代码改进及错误分析:

//显然,整数的两个因数应以平方根为对称轴,成左右对称,此消彼长
//之前的错误原因是将a与b与i的大小与对应关系弄混了
//i值两种可能:
//1.n为完全平方数,a = b
//2.n开方后去零化整,i值小于真正的平方根,即这个i应该是列,即b,行a为n/i(别弄反了)
for (int i = sqrt((double)n); i >= 1; i--) {if (n % i == 0) {a = n / i;b = i;break;}
}

正确代码:

#include<iostream>
using namespace std;
#include<string.h>
#include<math.h>
#include<algorithm>
int cmp(int a, int b) {return a > b;
}
int main() {int n;cin >> n;int a = 0, b = 0;//破防bug起源地//行与列的确认for (int i = sqrt((double)n); i >= 1; i--) {if (n % i == 0) {a = n / i;b = i;break;}}//一维数组的建立,用于储存数据和第一次快排int* num = new int[n];for (int i = 0; i < n; i++) {cin >> num[i];}sort(num, num + n, cmp);//二维数组的建立,用于提取一维数组数据和螺旋矩阵的位置布置int** num1 = new int* [a];for (int i = 0; i < a; i++) {num1[i] = new int[b];for (int j = 0; j < b; j++) {num1[i][j] = 0;}}//排兵布阵的核心代码命令int x = 0, y = 0;num1[0][0] = num[0];int k = 0;while (k < n - 1) {while (y + 1 < b && !num1[x][y + 1] && k < n - 1) {num1[x][++y] = num[++k];}while (x + 1 < a && !num1[x + 1][y] && k < n - 1) {num1[++x][y] = num[++k];}while (y > 0 && !num1[x][y - 1] && k < n - 1) {num1[x][--y] = num[++k];}while (x > 0 && !num1[x - 1][y] && k < n - 1) {num1[--x][y] = num[++k];}}//将命令结果呈现到显示屏上for (int i = 0; i < a; i++) {for (int j = 0; j < b; j++) {cout << num1[i][j];if (j != b - 1) {cout << " ";}}cout << endl;}
}

PAT1050_乙级_螺旋矩阵相关推荐

  1. C++学习之路 | PTA乙级—— 1050 螺旋矩阵 (25 分)(精简)

    1050 螺旋矩阵 (25 分) 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋 ...

  2. java 外螺旋矩阵_螺旋矩阵的java实现

    今天参加了腾讯实习生的在线笔试,螺旋矩阵的问题,算是ACM的入门题吧 想到了有两种实现递归和非递归 输入:3 输出: 1  2  3 8  9  4 7  6  5 输入:5 输出: 1  2  3 ...

  3. PAT 乙级练习 1050 螺旋矩阵 - 超级详细的思路讲解

    PAT 乙级练习 题解合集 本题链接 题目 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按 ...

  4. 用python做算法_自己用python写的螺旋矩阵生成算法

    自己用python写的螺旋矩阵生成算法 如果输入6,可以生成如下矩阵: 1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 ...

  5. 螺旋矩阵c++语言_一起刷 leetcode 之螺旋矩阵(头条和美团真题)

    微信公众号:每天晒白牙 关注可了解更多编程知识.问题或建议,请公众号留言;如果你觉得文章对你有帮助,欢迎关注与转发 题目描述 给定一个包含 m*n 个元素的矩阵(m 行,n 列),请按顺时针螺旋顺序, ...

  6. 1050. 螺旋矩阵(25)-PAT乙级真题

    本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...

  7. 用python画螺旋图案_用Python绘制彩色螺旋矩阵

    本文章小编教大家使用Python海龟绘制彩色螺旋矩阵,下面是相关代码块的解析,仅供喜爱python的小伙伴们学习参考. 1. 导入turtle库 from turtle import* 2.设置画布背 ...

  8. python螺旋输出矩阵_飘逸的python - 打印螺旋矩阵

    算法分析: 螺旋矩阵用二维数组表示,坐标(x,y),即(x轴坐标,y轴坐标) 顺时针螺旋的方向是->右,下,左,上,用数值表示即是x加1格(1,0),y加1格(0,1),x减1格(-1,0),y ...

  9. PAT 乙级 ------ 1046~1050 划拳、编程团体赛、数字加密、数列的片段和、螺旋矩阵附思路和代码

      这个鬼天气欸,又降温到十几度了.看帖子的你,今天也要开心啊!!!PEACE & LOVE 1046 划拳 思路: 每次读取四个数,根据规则求和比较,只有一方胜利一方失败从才会喝酒,同赢同输 ...

最新文章

  1. centos 的关机命令
  2. 3D 相机halcon算子,持续更新
  3. 2019世界大学排名全新出炉!清华北大排名大幅下滑?
  4. python库之numpy
  5. hdu 敌兵布阵(线段树之单点更新)
  6. Gradle里配置jetty实现静态资源的热部署
  7. 2022年下半年系统集成项目管理工程师(软考中级)报名条件
  8. std::vector内存清理
  9. 摄影光学与镜头pdf_摄影摄像基础pdf
  10. FFmpeg切割视频,自定义视频ts片段时长
  11. 高等数学学习笔记——第六十一讲——空间曲线的弧长与曲率
  12. 计算机网络技术在实践中应用,计算机网络技术及在实践中的具体应用
  13. 触摸开关模块,TTP223
  14. 阿里云认证有用吗?阿里云证书含金量及如何获得
  15. iOS 让 APP 在后台长时间运行
  16. Android 使用MediaPlayer播放本地raw资源超简单实现点击播放效果
  17. set transaction
  18. ADB调试删除手机内置应用
  19. SMETA验厂辅导,贸易公司、物流仓储公司是否可以申请SMETA审核
  20. Pytorch版deeplabv3+环境配置训练自己的数据集

热门文章

  1. modelsim仿真时,有Hiz值或输出为红线时的一种可能原因
  2. 如何用python生成雷达图
  3. [leetcode][289. 生命游戏]
  4. 语种识别公开语料库(可用于学术科研和项目研究)(自用)
  5. python图形界面设计代码_python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方...
  6. 基于Simulink的RBF神经网络的LMS自适应滤波器设计仿真
  7. 真假三菱PLC如何辨别
  8. 不知道电脑如何截图转文字?学会这几个帮你图片转文字
  9. 【第四课】Arcgis软件右键弹出窗口介绍
  10. 最新消息!信息系统项目管理师教程改版!