NOIP 2014 普及组 T3 螺旋矩阵
2024-10-13 23:46:30
【题意】
已知:n,r,c(n<=30000)
条件:给定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阶螺旋矩阵第r行第c列的值
【构思】
最常见的方法就是直接构造,时间复杂度O(n^2),在本题会超时;
那么就要化简运算:发现每层有4个转弯点,可以按转弯点转移,若(r,c)在其中则直接输出答案。
这样每层就只有4个点,时间复杂度为O(n)
【实现】
#include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int cnt,n,x,y,rx,ry; int main(void) { freopen("test.in","r",stdin); scanf("%d%d%d",&n,&rx,&ry); for (int i=n-1;;i-=2) { x++,y++; if (x==rx&&y<=ry&&ry<=y+n-1) { printf("%d\n",cnt+ry-y+1); break; } cnt+=i; y+=i; if (y==ry&&x<=rx&&rx<=x+n-1) { printf("%d\n",cnt+rx-x+1); break; } cnt+=i; x+=i; if (x==rx&&ry<=y&&y-n+1<=ry) { printf("%d\n",cnt+y-ry+1); break; } cnt+=i; y-=i; if (y==ry&&rx<=x&&x-n+1<=rx) { printf("%d\n",cnt+x-rx+1); break; } cnt+=i; x-=i; } return 0; }
【回顾】
1、构造类问题的解决方法 ①模拟 ②按照特殊点转移
2、构造类问题关键在于找出层次和特殊点
最新文章
- 【Java EE 学习 71 下】【数据采集系统第三天】【分析答案实体】【删除问题】【删除页面】【删除调查】【清除调查】【打开/关闭调查】
- HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
- EntityFrameWork使用过程问题总结
- 分享一个我的JavaScript版GridView多功能表格
- best matched pair
- Java集合——题目
- mark:如何使用FileZilla连接虚拟机上的Fedora
- Android 与 IIS服务器身份验证
- 使用javascript打开链接的多种方法
- ios 判断空字符串
- spring事物配置注意事项
- android 自定义百度地图放大缩小
- android——写xml
- Delphi2010生成GB2312字库乱码问题
- app耗电优化之二 使用电源管理来安排任务
- 201521123045 《Java程序设计》第2周学习总结
- Python——一个简单的类的创建和应用
- 使用rke快速安装K8s集群
- 如何解决failed to load the jni shared library问题
- swift 移除所有子控件
热门文章
- asp.net MVC4 lognet4 日志
- VirtualBox下Ubuntu利用桥接方式上网
- FZU 2146
- linux sudo apt-get用法详解
- Qt根据汉字生成位图,可连续调用,生成的位图不会有杂点
- Spring的";Hello, world";,还有";拿来主义";
- eclipse下添加viplugin插件的方法
- [SAP ABAP开发技术总结]OK_CODE
- CUBRID学习笔记 37 ADO.NET Schema Provider
- Socket&;GCDAsyncSocket(异步Socket)