1105 Spiral Matrix 给定数组向螺旋矩阵中填入数据
两个测试用例超时,可直接跳转到
目录
超时点1
超时点2
要做的事情是,将数组按照非升序/降序,顺时针从外围到内部一圈一圈地把数据填到矩阵中,并打印出来。也就是将数组排好序后,将矩阵的坐标和数组的下标对应起来。
所以用一个这样的数组存放矩阵相应位置上元素的数组下标。
int mp[200][200] = {0};
起先,我这样填充每一圈(注意交点的分配)
当然,从外到内,这个圈一定是在减小的, 减小多少,我用z来控制,程序如下,4个for循环分别代表4条直线上的元素
int idx = n-1,i,j,z=1;int sw = false;//stop while循环 for(z=1;;z++){i = z;if(sw)break;for(j=z;j<=col-z;j++){mp[i][j] = idx--;
// printf("mp[%d][%d]=%d\n",i,j,idx+1);if(idx<0){sw = 1;break;}}j = col+1-z;if(sw)break;for(i=z;i<=row-z;i++){mp[i][j] = idx--;
// printf("mp[%d][%d]=%d\n",i,j,idx+1);if(idx<0){sw = 1;break;}}i = row+1-z;if(sw)break;for(j=col-z+1;j>=z+1;j--){mp[i][j] = idx--;
// printf("mp[%d][%d]=%d\n",i,j,idx+1);if(idx<0){sw = 1;break;}}j = z;if(sw)break;for(i=row-z+1;i>=z+1;i--){mp[i][j] = idx--;
// printf("mp[%d][%d]=%d\n",i,j,idx+1);if(idx<0){sw = 1;break;}}}
至于i和j的起止到底是多少,我也不能一下子想出,但我知道肯定有对称性,于是试了出来(通过被注释掉的打印)
特别说明一下变量sw,是stop while的缩写,用于跳出while循环,且每次进入for循环之前都要判断一下sw是否为true。idx<0说明矩阵已填满。
1)每次idx--之后都判断一下idx是否<0,但是此时break,只能跳出内层for循环,要跳出外层循环还要借助sw变量。
2)何时判断sw呢?我们希望达到的效果是idx<0一旦成立,就不再填充,如果只是在刚进入while循环的时候判断一下,可能出现的情况是,在第三个for循环中断后,又进入第四个for循环,所以每次进入循环前都要判断一下sw。
但是这样做,有两个测试用例是运行超时的。我迫切地翻开参考书,想看看自己究竟哪里代码不优雅了。
1)那个sw的判断希望下次不要再看到了。直接把idx>=0放在while和for的括号里不香吗?理论上while可以不放,但是这样光标一直闪,程序会出问题。改进后如下
int idx = n-1,i,j,z=1;for(z=1;idx>=0;z++){i = z;for(j=z;j<=col-z&&idx>=0;j++){mp[i][j] = idx--;}j = col+1-z;for(i=z;i<=row-z&&idx>=0;i++){mp[i][j] = idx--;}i = row+1-z;for(j=col-z+1;j>=z+1&&idx>=0;j--){mp[i][j] = idx--;}j = z;for(i=row-z+1;i>=z+1&&idx>=0;i--){mp[i][j] = idx--;}}
代码清爽了很多,但是超时的问题仍毫无进展。
超时点1
2)我听参考书的话,加入了如下特判
if(n==1){printf("%d",a[0]);return 0;}
于是从21变成了22分,有一个测试用例通过了。还剩一个超时,并且我注意到,刚才的两个超时,显示的时间都是-,也许是陷入了某种死循环。
3)我尝试提取i和j的边界中的公因子,引入
int r = col-z;
int d = row-z;
矩阵填充代码变成如下
int idx = n-1,i,j,z=1;for(z=1;idx>=0;z++){i = z;int r = col-z;int d = row-z;for(j=z;j<=r&&idx>=0;j++){mp[i][j] = idx--;}j = r+1;for(i=z;i<=d&&idx>=0;i++){mp[i][j] = idx--;}i = d+1;for(j=r+1;j>=z+1&&idx>=0;j--){mp[i][j] = idx--;}j = z;for(i=d+1;i>=z+1&&idx>=0;i--){mp[i][j] = idx--;}}
很遗憾,那个测试用例还是没过
4)最后,我又找出自己的代码和参考书代码的一个区别,那就是我在填充过程中填充的是数组下标,而参考书直接填充的内容,这样输出的时候就不必先映射到下标再输出,于是我照做。
将所有的
mp[i][j] = idx--;
改成了
mp[i][j] = a[idx--];
于是输出时候的
int idx = mp[i][j];
printf("%d",a[idx]);
也就自然变成了
printf("%d",mp[i][j]);
还是超时。。
超时点2
5)最后,我又发现,程序对最内层只有一个数字的情况进行了特判,也就是在4个for循环后加入了如下代码
i++;
j++;
if(idx==0)mp[i][j] = a[idx--];
好了,AC。
完整代码如下
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
#include<map>
#include<string>
#include<stdlib.h>using namespace std;const int maxn = 10010;int mp[200][200] = {0};int main(){int n;int a[maxn];scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}if(n==1){printf("%d",a[0]);return 0;}int col,row;for(int i=(int)sqrt(n);i>=1;i--){if(n%i==0){col = i;break;}}row = n/col;//row>=col//a按照升序排好 sort(a,a+n);int idx = n-1,i,j,z;for(z=1;idx>=0;z++){int r = col-z;int d = row-z;for(i=z,j=z;j<=r&&idx>=0;j++){mp[i][j] = a[idx--];}for(i=z,j=r+1;i<=d&&idx>=0;i++){mp[i][j] = a[idx--];}for(i=d+1,j=r+1;j>=z+1&&idx>=0;j--){mp[i][j] = a[idx--];}for(i=d+1,j=z;i>=z+1&&idx>=0;i--){mp[i][j] = a[idx--];}i++;j++;if(idx==0)mp[i][j] = a[idx--];}for(int i=1;i<=row;i++){for(int j=1;j<=col;j++){printf("%d",mp[i][j]);if(j!=col)printf(" ");}printf("\n"); } return 0;
}
相关文章:

一晚上就能让你小腹变小的方法 - 健康程序员,至尚生活!
仅一晚上针对小腹的锻炼就会让它明显收紧,很不可思议吧?但它确实发生了。形体教练向我们推荐:做30次转身运动(双手抱在脑后站立,迅速分别向左右两侧依次扭转上肢,注意不要以膝盖为轴,使运动轴心保持在骨盆以…

Alpha 冲刺 (2/10)
前言 队名:拖鞋旅游队组长博客:https://www.cnblogs.com/Sulumer/p/9960487.html作业博客:https://edu.cnblogs.com/campus/fzu/Grade2016SE/homework/2365组内情况 燃尽图任务分布github签入记录苏路明(组长)过去两天…

互联网对erp行业到底有什么影响
1 财务管理的影响 总账、 应收应付、资金计划,支付管理。 生产计划的影响。 重大的疑惑。 转载于:https://www.cnblogs.com/sdgxbooy/p/8892655.html

PAT甲级排队问题合集 (持续更新中)
已加入的习题 A1014,A1017 问题1和2共性 1. 都是排队问题 2. 都有一条黄线 3. 都需要找到最先离开人的队伍 4. 都有着服务时间段限制(迟于某个时间点来不予受理) 问题1:1014 Waiting in Line 问题链接:1014 Waiting in Line 这一题,…

第三章:创建用户界面组件--可视化组件(一)
1.可视化组件 1.1关于可视化组件 可视化组件的特征包括:size(大小)、事件、样式、皮肤、行为。 行为:当组件被触发时,视觉,音乐效果的变化。 1.1 .1Spark and Halo 组件 Spark是flex 4中新加的组件。halo仍旧继承了以…

Rust 1.30带来更多元编程支持,并改进了模块系统
Rust的最新版本1.30扩展了过程宏,允许它们定义新的属性和类似于函数的宏。此外,它简化了Rust模块系统,使其更加一致、直观。 Rust 1.30引入了两种新类型的过程宏,“类属性的过程宏”和“类函数的过程宏”。过程宏是Rust元编程的基…

两种最大堆建堆方式
都是用完全二叉树的静态存储方式,下标从1开始。 No.1 先按照数组的次序填入完全二叉树,再从倒数第一个非叶子节点开始,一个个地看是不是要向下调整,一直下调到不能再调。 void downAdjust(int low,int high){int i low;int j …

汉字验证码和算式验证码
大家知道简单数字或者字母验证码很容易被破解,但是算式验证码或者中文汉字验证码不容易被破解, 所以建议大家在使用验证码的时候,尽量用算式验证码或者中文汉字验证码。 下面是我写的两种验证码代码,有用到的朋友可以参考下&#…

自定义Linq的Distinct
代码 1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.ComponentModel;4 usingSystem.Data;5 usingSystem.Drawing;6 usingSystem.Linq;7 usingSystem.Text;8 usingSystem.Windows.Forms;9 10 namespaceLinqTest11 {12 publicpartialclassForm1 : Form13 {14 p…

Python itertools 实现全组合
>>> import itertools >>> data itertools.product([A, B], [1, 2, 3]) >>> list(data) [(A, 1), (A, 2), (A, 3), (B, 1), (B, 2), (B, 3)] 转载于:https://www.cnblogs.com/xiecl/p/9961825.html

PAT(甲级)2021年春季考试 7-3 Structure of Max-Heap
考察:建堆,字符串的处理 建堆上,跳了坑,才发现自己之前的方法过于笨拙,详情见两种最大堆建堆方式 字符串处理上,走的弯路更大,但是也因此牢记了两个技巧 1. cin>>str可以用getline(cin…

[linux内核][linux中断]——软中断机制
点击打开链接 一,linux软中断的概念软中断(softirq)常常表示可延迟函数的所有种类,目前linux上使用的软中断个数是有限的,linux最多注册32个,目前使用了10个,在interrupt.h中定义,中…

JS中8个常见的陷阱
译者按: 漫漫编程路,总有一些坑让你泪流满面。 原文: Who said javascript was easy ? 译者: Fundebug为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。 这里我们针对JavaScript初学者给出一些…
支持支付宝(Alipay)付款的三个美国主机商
这段时间买国外主机的筒子们越来越多,而付款就是首先摆在大家眼前的一道障碍,大部分美国主机商只能通过信用卡购买,付款不方便。因为这个原因,很多人的美国主机都是从国内的公司或者个人买的,无法享受美国主机的优质服…

(C++)string 的两种输入方式和输出方式
注:头文件如下 #include<string> #include<cstdio> #include<iostream>using namespace std; 注:第一种输入方式遇到回车停止读入,第二种输入方式遇到空格停止读入。 两种读入方式也都可以用来读字符数组。 int main()…

ob_get_contents();basename;file_get_contents用法
ob_get_contents(); ob_end_clean(); ob_start()使用ob_start()把输出那同输出到缓冲区,而不是到浏览器。然后用ob_get_contents得到缓冲区的数据。 ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中…

零基础学汇编 --小甲鱼
来自http://www.51xue8.com/diannao/wangluobiancheng/2013-11-06/6584.html#fillback0100307b617b7b7b303232303266313839397b677b7b240000&anchortestanchor转载于:https://www.cnblogs.com/I-L-o-v-e-z-h-o-u/p/4235340.html

数据标准化_1
from sklearn.datasets import load_irisirisload_iris()#Z-score 数据标准化from sklearn.preprocessing import StandardScalerdata_standardStandardScaler().fit_transform(iris.data)# print(data_standard,data_standard)#Min-Maxfrom sklearn.preprocessing import MinM…

PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes
思路:用筛除法打素数表(与之相对的是枚举加逐个判断)是降低时间复杂度的第一个点,第二个点是运用上数学技巧,给定了等差数列的范围(2-MAX),给定了个数,那么最大的等差是可以求出的。循环的第一层从最大等差开始&#x…

hadoop中HBase子项目入门讲解
HBase 是Hadoop的一个子项目,HBase采用了Google BigTable的稀疏的,面向列的数据库实现方式的理论,建立在hadoop的hdfs上,一方面里用了hdfs的高可靠性和可伸缩行,另外一方面里用 了BigTable的高效数据组织形式.可以说HBase为海量数据的real-time相应提供了很好的一个开源解决方案…

C++/C union使用记一下锅
//首先,学习编程一定要记得加几个群或者加几个讨论组,因为这样你才能不断地进步还有吵架/滑稽 记一下 关于使用union结构体时遇到的一些坑 To zero-initialize an object of type T means: — if T is a scalar type (3.9), the object is set to the va…

推荐60+ Flex开发参考网站
推荐60 Flex开发参考网站 下面是一些好的Flex开发的网站或者Flex资源,如果你使用Flex开发,可以参考一下。 网上找的,可以参考参考!呵呵 新手入门参考: Adobe Flex 3 - adobe.comAdobe Flex Sample Applications - adobe.comVideo …

PAT(甲级)2020年秋季考试 7-4 Professional Ability Test
解题思路: 1.用拓扑排序判断给定的图是否是有向无环图(DAG) 在这个过程当中,对于入度为0的结点,在布尔数组中标记是初始结点 通过入队的结点个数是否等于总个数判断是不是DAG 注意:虽然有队列,但是不需要inq[]数组…

TestNG:org.openqa.selenium.os.UnixProcess$SeleniumWatchDog错误
在TestNG运行自动化测试用例的时候,浏览器FireFox正确打开,可是在测试用例运行完成后,我调用的是webdriver.quit()关闭程序的,结果却报以下错误: Sep 25, 2014 4:19:32 PM org.openqa.selenium.os.UnixProcess$Seleniu…

项目经理修炼手册 2.1.2 项目经理的基本功
具备以上素质的人,大体上可以算是具有基本的程序员素质了,但是想从程序员成为项目经理,必然还需要有一点进步,那额外的这些素质都有哪些呢? 曾经有人力资源的朋友问我要人,我介绍了几个技术上很不错的人&am…

CSS3动画过渡的jquery动态弹出框插件
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w178191520/article/details/84111711 在线演示 本地下载

PAT(甲级)2021年春季考试 7-4 Recycling of Shared Bicycles
解题思路: 先用Floyd算法求出全员最短路径矩阵。 然后使用DFS进行遍历,遍历的原则是就近贪心,对于每一个点先遍历离他最近的未访问点。 记录访问点的个数,同时用数组存放已访问点,如果访问点的个数不等于输入点数1(…

JAVA抽象类和接口的区别【附经典分析用例Door】
这篇文章对抽象类和接口说的很详细,希望对大家有所帮助. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类…

sql 2005提示未能加载包Microsoft SQL Management Studio Package
被360隔离了,请到360恢复区恢复。转载于:https://www.cnblogs.com/janealer/p/4238743.html

puppeteer爬虫的奇妙之旅
(爬虫)[puppeteer|] 爬虫又称网络机器人。每天或许你都会使用搜索引擎,爬虫便是搜索引擎重要的组成部分,爬取内容做索引。现如今大数据,数据分析很火,那数据哪里来呢,可以通过网络爬虫爬取啊。那我萌就来探讨一下网络爬…