【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列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...
随机推荐
- nosql_action
ps -aux 查当前端口占用 connecting to: test > show dbs local .078125GB testphp .203125GB > use testph ...
- api xml database 设计一种数据库
w 问题 0-新增和读取,可以忽略更新和删除: 1-被请求方的xml dom结构多层且不定,且未来可能增删某些键(dom节点),且键值长度最值可能无法确定: 3-请求过程可能出现异常exception ...
- Unix/Linux中Cron的用法
cron是unix或者linux下用来定时任务的命令,大致的用法如下: 1.服务的启动和关闭 /sbin/service crond start //启动服务 /sbin/service cr ...
- Hosts文件的位置
Operating System Version(s) Location Unix, Unix-like, POSIX /etc/hosts Microsoft Windows 3.1 %WinD ...
- Android 屏幕适配扫盲、教程
转载请注明出处:http://blog.csdn.net/my_truelove/article/details/66584865 訪问 ruicb.com,一键抵达我的博客! 扫描左側或右下方二维码 ...
- python3 中引用 HTMLTestRunner.py 模块的注意事项
HTMLTestRunner.py支持python2中运行,如果在python3.6.2中引用HTMLTestRunner.py模块,需要做一下更改: 1.更改HTMLTestRunner.py模块中 ...
- 安装mysql以及修改初始密码
我们可以采用类似安全模式的方法修改初始密码 先执行命令 mysqld_safe --skip-grant-tables & (设置成安全模式) &,表示在后台运行,不再后台运行的 ...
- Oracle 报 ORA-21561: OID generation failed 错误 mac 链接oracle
简单的说:在终端输入:sudo scutil --set HostName localhost
- Python之函数总结
一,函数的定义与调用 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开 def 函数名 ...
- Harbor私有仓库搭建
1.安装docker yum install -y dockersystemctl start dockersystemctl enable docker 2.安装docker-compose 1.下 ...