[NOIP2014][vijos1913]螺旋矩阵(模拟)
2016-10-29 07:36
465 查看
题目描述
传送门题解
这题我初中参加noip的时候做过,当时用pascal而且真的好弱,这种sb题的暴力都敲不出来。没法O(n2)模拟,考虑如何快速定位点(i,j)。发现点(i,j)一定是在从外到内的某一层上,且这一层左上角的第一个数是可以通过计算得出的。那么我们可以计算左上角的第一个数然后在这一层上暴力枚举到(i,j)。
时间复杂度O(n)。
我记得当时考试的时候就是这个思路,可我当时不会等差数列aaaaa,于是左上角的第一个数计算不出来233。不过当时暴力都没有打真是智障到突破天际_ (:з」∠)_
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,x,y,prex,prey,nowx,nowy,nxtx,nxty,nxtl,goal,ans; int sx[4]={0,0,1,-1}; int sy[4]={1,-1,0,0}; int layer(int x,int y) { return min(min(x,n-x+1),min(y,n-y+1)); } int main() { scanf("%d%d%d",&n,&x,&y); goal=layer(x,y); nowx=nowy=goal;prex=prey=0; ans=(4*n-4*(goal-1))*(goal-1)+1; while (1) { if (nowx==x&&nowy==y) { printf("%d\n",ans); break; } for (int i=0;i<4;++i) { nxtx=nowx+sx[i],nxty=nowy+sy[i]; if (!((nxtx!=prex||nxty!=prey)&&nxtx>=1&&nxtx<=n&&nxty>=1&&nxty<=n)) continue; nxtl=layer(nxtx,nxty); if (nxtl==goal) { prex=nowx,prey=nowy; nowx=nxtx,nowy=nxty; ans++; break; } } } }
相关文章推荐
- Vijos P1913 螺旋矩阵(模拟)
- NOIP2014普及组--螺旋矩阵(模拟)
- NOIP2014模拟 8.13
- jzoj. 3929. 【NOIP2014模拟11.6】创世纪
- JZOJ 3899. 【NOIP2014模拟】逻辑的连通性
- jzoj3796 【NOIP2014模拟8.21】议案决定
- JZOJ 3809. 【NOIP2014模拟8.25】设备塔
- 【JZOJ3824】【NOIP2014模拟9.9】渴
- NOIP2014模拟 8.12
- jzoj3927【NOIP2014模拟11.6】可见点数(欧拉函数)
- |Vijos|NOIP2015|模拟|P1975 扫雷游戏
- 3917 【NOIP2014模拟11.2A组】福慧双修 (Standard IO)题解
- JZOJ-senior-3910. 【NOIP2014模拟11.1A组】Idiot 的间谍网络
- JZOJ3815. 【NOIP2014模拟9.7】克卜勒
- 【NOIP2014模拟8.15】城市街区
- 【NOIP2014模拟8.24】小X 的道路修建
- JZOJ 3808 【NOIP2014模拟8.25】道路值守
- [JZOJ 3794]. 【NOIP2014模拟8.20】高级打字机
- 高中OJ 3793. 【NOIP2014模拟8.20】数字对
- db49 JZOJ 3928. 【NOIP2014模拟11.6】射击