[NOIP2014普及组]螺旋矩阵

题目地址:

ayyzvijos:http://pingce.ayyz.cn/vijos/Problem_Show.asp?id=2017

vijos:https://vijos.org/p/1913

COGS:http://218.28.19.228/cogs/problem/problem.php?pid=1811

题目来源:NOIP2014普及组第三题

问题分析:这道题的内容很易懂,而且容易实现,即直接构造出一个螺旋矩阵,输出对应位置即可。这样的方法大概可以过掉50%的数据。但是,对于100%的数据,n最大可以到30000,如果直接开这么大数组的话,肯定要爆0(内存溢出)。这说明这道题一定有更好的方法。

读题发现,只需输出1个位置的数值即可,而开数组的话,相当于求出了n2个位置,浪费了很多空间。解决办法肯定是不求那些没用的位置,只求一个位置即(i,j)。题中的螺旋矩阵有一个特点,即在每一个正方形边上(如图中线1、2、3),都是螺旋式递增的:

这给了我们一个信息,只要求出(i,j)位置所在的层数,就可以递推得到这个位置的值。观察图形,我们可以得到这个公式:

a[i,j]=该位置所在层的左上角数的值+从左上角到(i,j)顺时针前进的距离-1

例如,在上图中,若求位置为(6,3)位置的值,可以先求出它在第2层,第二层左上角是25,它到点(6,3)的距离为5+1=6,因此a[6,3]=25+6-1=30。思路有了,接下来还有三个问题:

1、如何求层数;

2、如何求这一层左上角位置对应的值;

3、如何求从左上角到这个点前进的距离。

对于问题1,不难发现,点(i,j)所在的层数为:(四个值分别对应(i,j)在上边、左边、下边、右边的情况)

cengshu=min{i,j,n-i+1,n-j+1}

对于问题2,有了层数之后,从最外层往里推,从第1层(最外层)到所在层的上一层的格子数总和+1也就是这层左上角的值了。通过图,我们知道,在7*7的矩阵中,第一层格子数为24=4*(7-1*2+1),第二层格子数为16=4*(7-2*2+1),第三层格子数为8=4*(7-3*2+1),因此,第x层的格子数为 4*(n-2*x+1) (在这里不做严谨证明),然后层层累加即可。

对于问题3,只需分四种情况讨论,详情看代码。

这样,通过数学方法,我们可以快速求出a[i,j],省去了大量时间、空间。

时间复杂度:O(n)

空间复杂度:O(1)

参考代码:

program matrix;
var
n,i,j,k,l,m,ceng,qishi,bianj1,bianj3:longint;
begin
assign(input,‘matrix.in‘);
reset(input);
assign(output,‘matrix.out‘);
rewrite(output);
readln(n,i,j);
k:=i;
ceng:=i;
if j<ceng then ceng:=j;
if (n-i+1)<ceng then ceng:=n-i+1;
if (n-j+1)<ceng then ceng:=n-j+1;
for k:=1 to ceng-1 do inc(qishi,(n-k*2+1)*4);
qishi:=qishi+1;
if (n mod 2=1)and(ceng=n div 2+1) then begin
writeln(n*n);
close(input);
close(output);
halt;
end;
bianj1:=ceng;
bianj3:=n-ceng+1;
if (i=bianj1)and(j<bianj3) then writeln(qishi+(j-bianj1));
if (j=bianj3)and(i<bianj3) then writeln(qishi+(bianj3-bianj1)+(i-bianj1));
if (i=bianj3)and(j>bianj1) then writeln(qishi+(bianj3-bianj1)*2+(bianj3-j));
if (j=bianj1)and(i>bianj1) then writeln(qishi+(bianj3-bianj1)*3+(bianj3-i));
close(input);
close(output);
end.

matrix.pas

时间: 2024-08-25 00:21:15

[NOIP2014普及组]螺旋矩阵的相关文章

[NOIP2014普及组]比例简化

题目地址: ayyzvijos:http://pingce.ayyz.cn/vijos/Problem_Show.asp?id=2016 vijos:https://vijos.org/p/1912 COGS:http://218.28.19.228/cogs/problem/problem.php?pid=1810 题目来源:NOIP2014普及组第二题 问题分析:题目描述很长,归纳起来,大意就是: 在区间[1,L]内求出2个数A’.B’,这两个数满足: 一.gcd(A’,B’)=1,即A’和

[NOIP2014普及组]珠心算测验

题目地址: ayyzvijos:http://pingce.ayyz.cn/vijos/Problem_Show.asp?id=2015 vijos:https://vijos.org/p/1911 COGS:http://218.28.19.228/cogs/problem/problem.php?pid=1809 题目来源:NOIP2014普及组第一题 问题分析:作为普及组的第一题,这个难度是可以的,而且有坑点.初步读题,我们会想到这样一种情况: count.in count.out 5 1

noip2014普及组

T1珠心算--暴力模拟 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();} while(c>='0'&am

cogs luogu 珠心算测试【noip2014 普及组】

1809. [NOIP2014]珠心算测试 ★   输入文件:countb.in   输出文件:countb.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] [提示] 输入输出文件名为countb 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 6 using namespace std; 7 const in

NOIP2014-普及组复赛-第三题-螺旋矩阵

题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序,在格子中依次填入1, 2, 3, ... , n,便构成了一个螺旋矩阵.2 下图是一个n = 4 时的螺旋矩阵. 1     2     3     4 12    13    14    5 11    16    15    6 10     9     8     7

NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)

题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放: 每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示.字符’+’,”-”,”/”,”|”的ASCII

HLG 1564 螺旋矩阵 (趣味C语言)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1564 Description 对于给定的一个数n,要你打印n*n的螺旋矩阵. 比如n=3时,输出: 1 2 3 8 9 4 7 6 5 Input 多组测试数据,每个测试数据包含一个整数n(1<=n<=32) Output 对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里. 在一组测试数据中,每个数占的字符宽度

noip2008普及组4题题解-rLq

(啊啊啊终于补到了今天的作业了) 本题地址:http://www.luogu.org/problem/show?pid=1058 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图.小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:每个顶

NOIP2008普及组 题解 -SilverN

T1 ISBN号码 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符, 其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标 准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第 二个分隔符后的五位数字代表该书在该出版社的编号:最后一位为识别码. 识别码的计