模拟【p2239】 螺旋矩阵
顾z
你没有发现两个字里的blog都不一样嘛 qwq
题目描述--->p2239 螺旋矩阵
看到题,很明显,如果直接模拟的话,复杂度为\(O(n^2)\)过不去.(这个复杂度应该不正确,我不会分析的啊 qwq.
因此我们需要一个比较厉害的方法解决这个题,
前置知识
我们手写一些矩阵,发现我们填的数是会分层的 !.
(同种颜色为一层.)
分层这个东西的话,我也不能具体解释,你可以认为是一圈一圈地填数.
xjb分析
打表!找规律
我们可以手写一个程序,(也可以手写,手写的话会更简单一些.)
模拟一下这个过程.
例如这个程序(话说,打个表我想了半小时? qwq 一定是我太垃圾了
下面的变量\(ceng\)的话,是因为构造出来的矩阵会分层。
void get(int n)
{
int cnt=0,x=1,y=1;
for(R int ceng=1;ceng<=(n+1)/2;ceng++)
{
while(y<=n-ceng+1)
res[x][y++]=++cnt;x++;y--;
while(x<=n-ceng+1)
res[x++][y]=++cnt;x--;y--;
while(y>=ceng)
res[x][y--]=++cnt;y++;x--;
while(x>ceng)
res[x--][y]=++cnt;x++;y++;
}
print();
}
打出来5*5的表是这样的 qwq
开始搬砖找规律.
- 第\(1\)行第\(j\)列对应的数就是j
- 第n列第\(i\)行对应的为\(n+i-1\)
- 第n行第\(j\)列对应的数为$3 \times n-j-1 $
- 再度填回第\(1\)列,第\(i\)行我们发现得到的对应数为 \(4 \times n-i-2\)
上面四点是最容易发现的规律,也是我们继续求解的关键.
注意: 如果上面四条规律并没有找到的话,希望大家能自己手推找一下规律.
(PS: 本人开始用6*6的表格找规律,结果第四条规律找错 qwq)
如何填充里层的数?
我们发现17这个位置与16是有关的.而16,又是\(4\times5-4\)
(多打几个表容易发现,第\(2\)行第\(1\)列这个位置的数为\(4 \times n-4\))
直接推导这个\(4 \times n-4\)的话是这样的
看图↓
我们黄色部分可以填充\(n\)个数,绿色部分由于黄色部分占领了一个格子,所以填充个数为\(n-1\)个,同理蓝色部分也只能填充\(n-1\)个数,红色部分由于上面有黄色部分,下面有蓝色部分,只能填充\(n-2\)个数.
总的来说,每一层共可以填充\(4 \times n-4\)个数
然后考虑搞事。
我们将更里层的数减去\(4\times n-4\),得到新的里层数据如下.
这时候你可能会大吼.
“woc!又让我填一遍?”
恍然大悟
我们发现,这样的话,我们又填一次这个矩阵,不过这个矩阵的大小从\(n\)变成了\(n-2\)
(消去了,最左和最右两边.)
而假设我们之前要查找的数的位置为\((4,4)\)就变成了\((3,3)\)
如果是\((3,4)\)就变成了\((2,3)\),
所以说,当我们求内层的时候,所求原数的位置(x,y)就将变成(x-1,y-1).
而对于那些直接满足上面我们发现的规律的数的话,我们可以直接输出.
所以不必考虑这些数的输出怎么办.
最终我们一定会拆到最里层.
以此类推
我们一直拆下去,每次加上的答案就是\(4\times n-4\)。
注意:这个n是在变化的.
因此我们可以码出代码
#include<bits/stdc++.h>
#define R register
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,x,y,ans;
int main()
{
in(n),in(x),in(y);
//如果刚开始的话x,y就满足四条规律.
//我们会在第一次输出答案,此时ans为0,无影响.
here:;
if(x==1)printf("%d",y+ans);
else if(y==n)printf("%d",n+x-1+ans);
else if(x==n)printf("%d",3*n-y-1+ans);
else if(y==1)printf("%d",4*n-x-2+ans);
else
{
ans+=4*n-4;
x--,y--,n-=2;
goto here;
//这句话达到了递归的效果。
//我们的程序运行到这一步会到达上面的here,即再度执行这些if语句.
}
}
模拟【p2239】 螺旋矩阵的更多相关文章
- 洛谷——P2239 螺旋矩阵
P2239 螺旋矩阵 题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中 ...
- P2239 螺旋矩阵
P2239 螺旋矩阵 题解 这题看上去是个暴力,但是你看数据范围啊,暴力会炸 实际上这是一道数学题QWQ 先看看螺旋矩阵是个什么亚子吧 好吧,找找规律 1 2 ... ... ... ... ... ...
- Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵
螺旋矩阵 题目 问题描述 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵. 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 ...
- 洛谷 P2239 螺旋矩阵(模拟 && 数学)
嗯... 题目链接:https://www.luogu.org/problem/P2239 这道题首先不能暴力建图,没有简单方法,只有进行进行找规律. AC代码: #include<cstdio ...
- P2239螺旋矩阵
传送 看到这数据范围,显然咱不能暴力直接模拟(二维数组开不下,而且会T掉) 我们目前有两种选择: 1.优化暴力 走这边(jyy tql%%%) 2.数学做法 我们看一下题目中的那个矩阵 我们能不能找 ...
- 洛谷P2239 螺旋矩阵
传送门 分析:将整个矩阵看成 "回" 形状的分层结构,然后进行去层处理,使得要求得 \((i,j)\) 处于最外层,然后再分情况讨论.最外面的一层共有数: $ 4 * n - 4 ...
- 【洛谷P2239 螺旋矩阵】
题目链接 直接看题 一看就很数学 我们不妨来画图 画出几个矩阵,找他们的关系 然后发现 当i==1时,对应的值就是j所对应的值: 当i==n时,所对应的值就是3*n-2-j+1: 当j==1时,所对应 ...
- 【模拟】[NOIP2014]螺旋矩阵[c++]
题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...
- PAT 1105 Spiral Matrix[模拟][螺旋矩阵][难]
1105 Spiral Matrix(25 分) This time your job is to fill a sequence of N positive integers into a spir ...
随机推荐
- 架构师速成6.7-设计开发思路-uml 分类: 架构师速成 2015-07-29 18:25 157人阅读 评论(0) 收藏
uml是什么东西?统一建模语言,一门语言,是用来进行软件设计的一门语言. 其实一门语言的诞生并不伟大,让大多数人都使用才足够伟大.uml就是一门伟大的语言,因为目前软件设计的唯一语言就是它. UML其 ...
- phpStorm9.0 +xampp+chrome php调试环境配置!
不多说,直接上step by step: 1.xampp配置 看看我的XAMPP版本: 修改配置文件,该打开打开,该加上加上,结果如下(当前需要重新启动apache,配置才会生效): [XDebug] ...
- mysql一机多实例安装记录
因为想研究mycat,所以需要安装多个mysql实例进行研究.限于没有多于计算机,只能在本机安装了.通过mysql文档,自己琢磨着安装成功! 目录结构如下: 其中one和two文件夹用来模拟数据库分库 ...
- 孤荷凌寒自学python那些事第一天
孤荷凌寒自学python第一天 初识python (学习过程的完整录像分享链接在文末,手写笔记图片在文末) 一种编程语言,首先是它的语言的基本架构,python总体让人耳目一新: 今天其实只接触到了它 ...
- Python中关于split和splitext的差别和运用
在使用Python的过程中,在处理字符串的时候会遇到split()和os.path.split()两个函数,他们的主要区别可以概括为一个从前往后搜索字符串,后者则是从后往前搜索 '.'(reverse ...
- Python课程设计 搭建博客
安装包Github地址 Python综合设计 233博客 注意还有个email文件是需要填入自己信息的,比如最高权限账号和要发送邮件的账号密码 请安装Python2.7环境,本服务器所用环境为 设置环 ...
- BZOJ 1043 【bzoj1043】[HAOI2008]下落的圆盘 | 暴力么??
题目: 题解: 大概是黄学长的博客 #include<cstdio> #include<algorithm> #include<cstring> #include& ...
- AtCoder Regular Contest 093 E: Bichrome Spanning Tree(生成树)
Bichrome Spanning Tree 题意: 给出一个n个点,m条边的无向连通图,现在要给每条边染色,可以染成黑色或者白色. 现在要求在染色完毕后,找出一个至少包含一条黑边和一条白边的最小生成 ...
- mac 安装 visual studio 配置
前言:今天主要分享的是 Mac 下一款编程软件--Visual Studio,的确,这款软件之前一直是只有 Windows 系统独占的,2017年终于开发了 Mac 版本. 微软这次为 Mac 开发者 ...
- Echarts 基础知识浅析
1. 引入Echarts Echarts是基于canvas的数据可视化产品,由百度公司推出 参考官方文档,引入教程示例即可,注意有两种引入方式: (1)直接引入 (2)模块化引入 2. 基本API使用 ...