【NOIP2014 普及组】螺旋矩阵
【NOIP2014 普及组】螺旋矩阵
一、题目
【NOIP2014 普及组】螺旋矩阵
时间限制: 1 Sec 内存限制: 128 MB
提交: 18 解决: 0
[提交][状态][讨论版]
题目描述
一个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
现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。
输入
输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
输出
输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。
样例输入
4 2 3
样例输出
14
提示
【数据说明】
对于50%的数据,1 ≤ n ≤
100;
对于100%的数据,1 ≤ n ≤
30,000,1
≤ i ≤ n,1
≤ j ≤ n。
二、分析及代码
【题解】
首先,本题有两种思路。
1.老老实实填数组。(此方法简单易懂,但当矩阵过大时,就会出现数组开不够大,或long long也不够的情况)
2. 用算法找规律,但规律不是一般的难找。我就简单说说我找到的规律。
|
1 |
2 |
3 |
4 |
|
12 |
13 |
14 |
5 |
|
11 |
16 |
15 |
6 |
|
10 |
9 |
8 |
7 |
|
1 |
2 |
|
4 |
3 |
首先对比两表,你就会发现下表就是上表中间四格每个减去12,正好就是外圈12个数中最大的;
而12就是外圈边长的4倍减4;
于是,就成了这样
|
1 |
2 |
3 |
4 |
|
12 |
1 |
2 |
5 |
|
11 |
3 |
4 |
6 |
|
10 |
9 |
8 |
7 |
红色是内圈,黑色是外圈
红色基数为12,黑色基数为0
同时,每一圈最上方的一行就是i+j-1的值。
最右方的一列就是i+j-1的值。
最下方的一行就是4n-i-j-1的值。
最左方的一列就是4n-i-j-1的值。
(一定要记得加上外圈基数哦!)
DP思路
状态:
用f[n][i][j]表示n阶方块i,j位置的值。
对于外圈的:
i表示列,j表示行
if(i>=j)
f[n][i][j]= i+j-1
if(i<j)
f[n][i][j]= 4n-i-j-1
对于内圈:
f[n][i][j]= f[n-2][i-1][j-1]+n*n-(n-2)*(n-2);
初始状态:
f[1][1][1]=1
f[2][1][1]=1
f[2][2][1]=2
f[2][2][2]=3
f[2][1][2]=4
外圈表示:
if(j==1||i==1||j==n||i==n)
内圈表示:
i>1&&i<n&&j>1&&j<n
代码
#include <iostream>
using namespace std;
int i=,j=,n=;
void luo(int n1)
{
int a=,k,l;
for (l=;l<n1;l++)
{
a=a+n*-l*+;
}
if (i>=j) printf ("%d",a+i+j-*n1+);
else printf ("%d",a+(n-*n1+)*-i-j+n1+n1+);
}
int main()
{
freopen("in2.txt","r",stdin);
int i1,j1;
scanf ("%d %d %d",&n,&j,&i);
//cout<<n<<j<<i;
i1=i;
j1=j;
if (i1>n/) i1=n-i1+;
if (j1>n/) j1=n-j1+;
if(i1>j1) luo(j1);
else luo(i1);
}
【NOIP2014 普及组】螺旋矩阵的更多相关文章
- [NOIP2014] 普及组
珠心算测验 模拟. 将所有“两个不同数之和”装进桶里,扫描原数组记录满足条件的数的个数. /*by SilverN*/ #include<iostream> #include<alg ...
- 螺旋矩阵 noip2014普及组
本题可以直接模拟填数字,也可以直接计算结果. 代码一:(这个代码,缺陷在于数组太大,浪费内存啊.另外,循环次数也不少.总之,时间空间的消耗都不小.) /*======================= ...
- noip2014普及组——珠心算测验
题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师采用一种快速考察珠 ...
- [NOIP2014普及组]子矩阵
题目:洛谷P2258.Vijos P1914.codevs 3904. 题目大意:给你一个矩阵,要你找一个r行c列的子矩阵,求最小分值(子矩阵和分值的定义见原题). 解题思路:n和m比较小,考虑暴力. ...
- noip2014普及组 比例简化
题目描述 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果.例如,对某一观点表示支持的有1498 人,反对的有 902人,那么赞同与反对的比例可以简单的记为1498:902. 不过,如 ...
- [NOIP2014普及组T1]珠心算测验 - NTT
求数组有多少个数,恰好等于集合中另外两个(不同的)数之和? 注意到数集比较小,而且涉及到下标的加法,可以很自然地想到卷积 注意减去自己加自己的贡献 真是一道NTT练手好题 #include <i ...
- NOIP 2014 普及组 T3 螺旋矩阵
[题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...
- NOIP2014-普及组复赛-第三题-螺旋矩阵
题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵 ...
- 【模拟】[NOIP2014]螺旋矩阵[c++]
题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...
随机推荐
- Springboot中读取自定义名称properties的
Springboot读取自定义的配置文件时候,使用@value,一定要指定配置文件的位置! 否则报错参数化异常!
- MySql最左前缀原则
简单整理记录下,之前一直都没有关注过这个问题 最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上, 注:如果第一个字段是范围查询需要单独建一个索引 注:在创建多列索引时,要根据 ...
- SpringMVC流程架构图
[组件说明] 以下组件通常使用框架提供实现: 1.DisPatcherServlet:前端控制器(不需要程序员开发) 用户请求到达前端控制器,它相当于MVC模式中的C(Controller),Disp ...
- 我的Android进阶之旅------>Android知识图谱
Android知识图谱,快来看看哪方面有漏洞? 该图转自:http://blog.csdn.net/xyz_lmn/article/details/41411355
- 1、Python request(爬虫-百度翻译)
#encoding=utf-8 import requests def fanyi(): while True: context = input("请输入翻译的内容(退出q):") ...
- (扫盲)DTO数据传输对象
DTO即数据传输对象.但从定义上看就是简单的用来传递数据的.主要用途是在框架中定义DTO来绑定表现层中的数据.学过MVC.EF实体模型的都应该知道,我们可以定义一个Model实体来实现前后台数据的交互 ...
- 【WEB】前段优化
模块化管理: sea.js, require.js 压缩:r.js gulp.js, grunt.js 加速:cdn
- Admin添加字段
后台扩展用户信息,注意要到settings里面进行设定,有关联和继承两种方式 首先的关联表可以关联到user表但,主键在user表当中,所以没法直接在user表当中看到相关信息,要是通过继承扩展的话, ...
- 使用BUCK进行iOS项目打包
关于BUCK BUCK是Facebook开源的快速打包工具,可以用于多种语言及平台的项目打包,例如:C.C++.Java.iOS.Android等等.用于大型的iOS.Android项目,可以显著提升 ...
- macOS 简单使用
在macOS下进行开发,首先要能够熟练的使用macOS系统. 图形界面和触摸板的操作,时间长了自然就会熟悉,也会发现很好用. 关于快捷键有几点注意一下: Windows下好多跟ctrl结合的快捷键(如 ...