博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P2239 螺旋矩阵
阅读量:4557 次
发布时间:2019-06-08

本文共 1088 字,大约阅读时间需要 3 分钟。

题目链接:

这道题已经明显地告诉我们了:

对于100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n

所以模拟填数会TLE

所以说

找规律大法好 orz

我和很多人的思路一样,先确定要求的数在哪一层(变量名:m)。但之后我是把所在层左上角上的数(变量名:flag)算出来,再根据要求的数在当前层的新的位置,用flag推算出来。

看一个模拟表格

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

输入 5 4 2

如果人脑用我的方法模拟的话,应该是这样的:

  1. 第四行第二列的数在第二层
  2. 所在层左上角的数是17
  3. 要求的数的新位置是3 1
  4. 要求的数在17的正下方,且与17的距离为2
  5. 要求的数是23

大致是这么一个过程

接下来该上代码了

#include
using namespace std;int ans,x,y,flag;int main(){ //输入 int n,i,j; cin>>n>>i>>j; //计算层数 ,m就是要求数所在的层数。if的作用就懒得说了,自己看吧 if(i>n/2) y=n-i+1; else y=i; if(j>n/2) x=n-j+1; else x=j; int m=min(x,y); //求所在层的左上角的数 flag=1; for(int k=1;k<=m-1;k++) { flag+=4*(n-1); n-=2; } //根据新位置求数 int x2=i-m+1,y2=j-m+1;//数在层上的新位置是x2行,y2列 //四个if判断该数在左上角的哪个位置 if(x2==1) //正右方 即表格中的2/3/4/5(假设以1为左上角,下同) { cout<
x2)//右下角的正上方 即表格中的6/7/8 { cout<
y2) //右下角的正左方 即表格中的12/11/10 { cout<

语言表述能力有限,敬请原谅。

转载于:https://www.cnblogs.com/wxl-Ezio/p/8507615.html

你可能感兴趣的文章
BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
查看>>
UVA 12633 Super Rooks on Chessboard [fft 生成函数]
查看>>
memcache 启动 failed to start
查看>>
欧拉函数与欧拉定理
查看>>
fzyzojP2984 -- 序列变换问题
查看>>
poj 2888 Magic Bracelet
查看>>
mysql排序让空值NULL排在数字后边
查看>>
Mono for Android 实现高效的导航
查看>>
30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
查看>>
动画制作 手机APP制作以及响应式的实现
查看>>
我的第一篇博文(Winfrom下WebBrowser控件的使用)
查看>>
git使用笔记(六)github
查看>>
30+ 强大的Buddypress主题–开始您的社区站点吧
查看>>
cinder侧卸载卷流程分析
查看>>
codeforcesD_状压dp
查看>>
windows下通过pid 找到运行程序的路径
查看>>
【字符集】字符集和编码知识【转】
查看>>
不懂技术的人不要对懂技术的人说这很容易实现
查看>>
正则中需要转义的符号
查看>>
Solr局部或指定字段更新之set用法
查看>>