',subtitle:{text:["Loading..."],hitokoto:{enable:!0,show_author:!0,api:"https://v1.hitokoto.cn"},typing_speed:100,backing_speed:80,starting_delay:500,backing_delay:1500,loop:!1,smart_backspace:!0},text_color:{light:"#434343",dark:"#d1d1b6"},text_style:{title_size:"2.8rem",subtitle_size:"1.5rem",line_height:1.2},custom_font:{enable:!1,family:null,url:null},social_links:{enable:!0,style:"default",links:{github:"https://github.com/FrederickBun",instagram:null,zhihu:"https://www.zhihu.com/people/frederick-asyou",twitter:"https://twitter.com/FrederickAsYou",email:"i@setbun.com",bilibili:"https://space.bilibili.com/689929775?from=buntalk",facebook:"https://www.facebook.com/FrederickAsYou",youtube:"https://www.youtube.com/@Fredgg0017","fa-solid fa-train-subway":"https://www.travellings.cn/go.html","fa-solid fa-bell":"https://follow.it/buntalk?leanpub"},qrs:{weixin:null,"fa-solid fa-circle-dollar-to-slot":"https://cdn.jsdelivr.net/gh/FrederickBun/upyun-rhimgcdn@img/upload/202408110944048.png"}}},plugins:{feed:{enable:!0},aplayer:{enable:!1,type:"fixed",audios:[{name:null,artist:null,url:null,cover:null,lrc:null}]},mermaid:{enable:!0,version:"9.3.0"}},version:"2.7.2",navbar:{auto_hide:!1,color:{left:"#DCE2F1",right:"#FAF9DE",transparency:35},width:{home:"1200px",pages:"1000px"},links:{Home:{path:"/",icon:"fa-solid fa-planet-ringed"},Library:{icon:"fa-solid fa-book-sparkles",submenus:{Timeline:"/archives",Categories:"/categories",Tags:"/tags"}},Services:{icon:"fa-solid fa-server",submenus:{"Uptime status":"https://status.setbun.com/","Count Service":"https://vercount.one/","Whois Search":"https://whois.api.setbun.com/"}},About:{icon:"fa-solid fa-mug-hot",submenus:{Me:"/about",Links:"/links",Essays:"/essays",Photos:"/masonry",Subscribe:"/subscribe",Porfolio:"https://frederication.work"}}},search:{enable:!0,preload:!1}},page_templates:{friends_column:2,tags_style:"blur"},home:{sidebar:{enable:!0,position:"left",first_item:"menu",announcement:'营火,噼啪作响……
',show_on_mobile:!0,links:{Timeline:{path:"/archives",icon:"fa-regular fa-timeline"},Tags:{path:"/tags",icon:"fa-regular fa-tags"},Categories:{path:"/categories",icon:"fa-regular fa-folder-closed"},Essays:{path:"/essays",icon:"fa-regular fa-comment"},Photos:{path:"/masonry",icon:"fa-regular fa-images"},Travelling:{icon:"fa-solid fa-train-subway",path:"https://www.travellings.cn/go.html"},Subscibe:{icon:"fa-solid fa-bell",path:"/subscribe"}}},article_date_format:"auto",excerpt_length:300,categories:{enable:!0,limit:10},tags:{enable:!0,limit:10}},footerStart:"2023/2/6 03:09:13"},window.lang_ago={second:"%s seconds ago",minute:"%s minutes ago",hour:"%s hours ago",day:"%s days ago",week:"%s weeks ago",month:"%s months ago",year:"%s years ago"},window.data={masonry:!0}
Problem
题目背景
NOIP2014 普及组 T3
题目描述
一个行列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第行第列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入,便构成了一个螺旋矩阵。
下图是一个时的螺旋矩阵。
现给出矩阵大小以及和,请你求出该矩阵中第行第列的数是多少。
输入格式
共一行,包含三个整数,,,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
输出格式
一个整数,表示相应矩阵中第行第列的数。
样例 #1
样例输入 #1
样例输出 #1
提示
【数据说明】
对于的数据,;
对于的数据,。
Solution
1.题目分析
这个题目是一个简单的模拟(这里只是说其中一种做题方案,其实还可以用其他方法)
2.思路分析
既然已经说了是模拟,那么就是模拟呗
其实,模拟根本就不需要开 30000*30000
的数组。考虑到它是求第i行第j列的数,其实我们可以只针对第j列的数,进行填数模拟,这样时间复杂度就降到了O(N)了。模拟其实也很简单,就是向右绕半圈,向左绕半圈,直到行等于i时跳出就可以了。
另外,如果这样模拟,就会有一个坑点难以想到。有时候,可能绕的这半圈已经变成了一条直线了,这样这第i行的数就可能在这条直线中,则必须加一个特判,加上上一个点到终点的距离,然后就得跳出了。如果不加特判,程序继续运行,模拟便会出错,然后就只有 60
分了……
话不多说,模拟也就是这么一回事了!那么,我们上代码吧!
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <bits/stdc++.h> #define int long long #define endl "\n" using namespace std; signed main() { int n, x, y; cin >> n >> x >> y ; int rx = 1, num = y; int up = 1, down = n, zuo = 1, you = n; bool fx = true; while (rx != x) { if (fx) { if (you == y) { num += x - rx; break; } } else { if (zuo == y) { num += rx - x; break; } } if (fx) { num += (you - y + 1) * 2 + down - rx - 2; rx = down; you -- ; up ++ ; } else { num += (y - zuo + 1) * 2 + rx - up - 2; rx = up; zuo ++ ; down -- ; } fx = !fx; } cout << num ; return 0; }
|
支持一下 吧球球啦!
Summary
通过模拟方向来输出,最后再说一句:请勿直接复制题解,需自行理解再重写,tj不是你ac的理由哦!
- Title: 「题解」 [NOIP2014 普及组] 螺旋矩阵
- Author: 磅豆龙
- Created at : 2024-07-12 09:59:17
- Updated at : 2024-08-03 12:44:47
- Link: https://blog.setbun.com/p/20240712.html
- License: This work is licensed under CC BY-NC-SA 4.0.