PAT1050_乙级_螺旋矩阵
这道题折腾了好久,最后发现不是二维矩阵的相关问题,而是一个很简单的小问题
接下来为列出遇到的各种问题,并逐个分析
本题涉及的新知识点:
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_乙级_螺旋矩阵相关推荐
- C++学习之路 | PTA乙级—— 1050 螺旋矩阵 (25 分)(精简)
1050 螺旋矩阵 (25 分) 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋 ...
- java 外螺旋矩阵_螺旋矩阵的java实现
今天参加了腾讯实习生的在线笔试,螺旋矩阵的问题,算是ACM的入门题吧 想到了有两种实现递归和非递归 输入:3 输出: 1 2 3 8 9 4 7 6 5 输入:5 输出: 1 2 3 ...
- PAT 乙级练习 1050 螺旋矩阵 - 超级详细的思路讲解
PAT 乙级练习 题解合集 本题链接 题目 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按 ...
- 用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 ...
- 螺旋矩阵c++语言_一起刷 leetcode 之螺旋矩阵(头条和美团真题)
微信公众号:每天晒白牙 关注可了解更多编程知识.问题或建议,请公众号留言;如果你觉得文章对你有帮助,欢迎关注与转发 题目描述 给定一个包含 m*n 个元素的矩阵(m 行,n 列),请按顺时针螺旋顺序, ...
- 1050. 螺旋矩阵(25)-PAT乙级真题
本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...
- 用python画螺旋图案_用Python绘制彩色螺旋矩阵
本文章小编教大家使用Python海龟绘制彩色螺旋矩阵,下面是相关代码块的解析,仅供喜爱python的小伙伴们学习参考. 1. 导入turtle库 from turtle import* 2.设置画布背 ...
- python螺旋输出矩阵_飘逸的python - 打印螺旋矩阵
算法分析: 螺旋矩阵用二维数组表示,坐标(x,y),即(x轴坐标,y轴坐标) 顺时针螺旋的方向是->右,下,左,上,用数值表示即是x加1格(1,0),y加1格(0,1),x减1格(-1,0),y ...
- PAT 乙级 ------ 1046~1050 划拳、编程团体赛、数字加密、数列的片段和、螺旋矩阵附思路和代码
这个鬼天气欸,又降温到十几度了.看帖子的你,今天也要开心啊!!!PEACE & LOVE 1046 划拳 思路: 每次读取四个数,根据规则求和比较,只有一方胜利一方失败从才会喝酒,同赢同输 ...
最新文章
- centos 的关机命令
- 3D 相机halcon算子,持续更新
- 2019世界大学排名全新出炉!清华北大排名大幅下滑?
- python库之numpy
- hdu 敌兵布阵(线段树之单点更新)
- Gradle里配置jetty实现静态资源的热部署
- 2022年下半年系统集成项目管理工程师(软考中级)报名条件
- std::vector内存清理
- 摄影光学与镜头pdf_摄影摄像基础pdf
- FFmpeg切割视频,自定义视频ts片段时长
- 高等数学学习笔记——第六十一讲——空间曲线的弧长与曲率
- 计算机网络技术在实践中应用,计算机网络技术及在实践中的具体应用
- 触摸开关模块,TTP223
- 阿里云认证有用吗?阿里云证书含金量及如何获得
- iOS 让 APP 在后台长时间运行
- Android 使用MediaPlayer播放本地raw资源超简单实现点击播放效果
- set transaction
- ADB调试删除手机内置应用
- SMETA验厂辅导,贸易公司、物流仓储公司是否可以申请SMETA审核
- Pytorch版deeplabv3+环境配置训练自己的数据集
热门文章
- modelsim仿真时,有Hiz值或输出为红线时的一种可能原因
- 如何用python生成雷达图
- [leetcode][289. 生命游戏]
- 语种识别公开语料库(可用于学术科研和项目研究)(自用)
- python图形界面设计代码_python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方...
- 基于Simulink的RBF神经网络的LMS自适应滤波器设计仿真
- 真假三菱PLC如何辨别
- 不知道电脑如何截图转文字?学会这几个帮你图片转文字
- 【第四课】Arcgis软件右键弹出窗口介绍
- 最新消息!信息系统项目管理师教程改版!