题目描述

一个n行n列的螺旋矩阵可由如下方法生成:

从矩阵的左上角(第1行第1列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, … , n,便构成了一个螺旋矩阵。

下图是一个n = 4 时的螺旋矩阵。

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。

输入格式:
输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

输出格式:
输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。

输入样例#1:
4 2 3

输出样例#1:
14

【数据说明】
对于50%的数据,1 ≤ n ≤ 100;
对于100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。

思路

我想到的第一种思路是开一个二维数组,螺旋填入数字,按照坐标输出对应位置的元素。但当n非常大的时候,无法开出相应的二维数组。然后就想到模拟螺旋填数过程,用两个变量x,y存当前填数的格子的坐标。当x=i,y=j的时候,输出当前要填的数。
如果一个格子一个格子的去填数字一定会超时,而且在一条直线上直到转弯前需要填的格子数目是可以通过计算得出的。只要在转弯处判断目标格子是否在当前要填的直线段上,在的话就用已经填的格子数目加上目标格子相应坐标与当前直线段的端点坐标的差,否则加上当前直线段所有要填的格子数目,然后转弯。

代码[c++]
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int main() {
int n;
scanf("%d",&n);
int x,y;
scanf("%d%d",&x,&y);
int xx=1,yy=1;
long long int ans = 1;
int a=n,b=n,c=1,d=1;//相当于划定边界
if(n%2==1&&(n+1)/2==x&&(n+1)/2==y)//特判n为奇数且求中心格子
ans=n*n;
else {
while(1) {
if(xx==x&&y>=yy&&y<a) {
ans+=(y-yy);
break;
} else {
ans+=(a-yy);
yy=a;
}
a--;
if(yy==y&&x>=xx&&x<b) {
ans+=(x-xx);
break;
} else {
ans+=(b-xx);
xx=b;
}
b--;
if(xx==x&&y<=yy&&y>c) {
ans+=(yy-y);
break;
} else {
ans+=(yy-c);
yy=c;
}
c++;
if(yy==y&&x<=xx&&x>d) {
ans+=(xx-x);
break;
} else {
ans+=(xx-d);
xx=d+1;
yy=c;
}
d++;
}
}
printf("%lld\n",ans);
return 0;
}

【模拟】[NOIP2014]螺旋矩阵[c++]的更多相关文章

  1. Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵

    螺旋矩阵 题目 问题描述 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵. 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 ...

  2. 【NOIP2014 普及组】螺旋矩阵

    [NOIP2014 普及组]螺旋矩阵 一.题目 [NOIP2014 普及组]螺旋矩阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 0 [提交][状态][讨论版] 题目描 ...

  3. 模拟【p2239】 螺旋矩阵

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述--->p2239 螺旋矩阵 看到题,很明显,如果直接模拟的话,复杂度为\(O(n^2)\)过不去.(这个复杂度应该不正确,我不会分 ...

  4. PAT 1105 Spiral Matrix[模拟][螺旋矩阵][难]

    1105 Spiral Matrix(25 分) This time your job is to fill a sequence of N positive integers into a spir ...

  5. NOIP 2014 普及组 T3 螺旋矩阵

    [题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...

  6. NOIP2014-普及组复赛-第三题-螺旋矩阵

    题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵 ...

  7. HrbustOJ 1564 螺旋矩阵

    Description 对于给定的一个数n,要你打印n*n的螺旋矩阵. 比如n=3时,输出: 1 2 3 8 9 4 7 6 5 Input 多组测试数据,每个测试数据包含一个整数n(1<=n& ...

  8. 使用 JS 输出螺旋矩阵

    关于螺旋矩阵 这是我曾经遇到过的面试题,在 LeetCode 上找到了题目的原型,难度中等.题目描述如下: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中 ...

  9. PAT——1050. 螺旋矩阵

    本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m- ...

随机推荐

  1. (3).NET CORE微服务 Micro-Service ---- Consul服务治理

    Consul是注册中心,服务提供者.服务提供者.服务消费者等都要注册到Consul中,这样就可以实现服务提供者.服务消费者的隔离. 除了Consul之外,还有Eureka.Zookeeper等类似软件 ...

  2. Java基础知识➣多线程编程(五)

    概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源, ...

  3. NEST - 编写布尔查询

    Writing bool queries Version:5.x 英文原文地址:Writing bool queries 在使用查询 DSL 时,编写 bool 查询会很容易把代码变得冗长.举个栗子, ...

  4. 【译】写好JavaScript条件语句的5个技巧

    译文 当我们写JavaScript代码时,经常会用到到条件判断处理,这里有5个技巧能使你写出更好.更简洁的条件语句. 1.使用Array.includes处理多种条件 让我们来看一下的例子: // c ...

  5. device not found解决方案

    今天在使用cordova tools进行真机调试的,报了一个错:device not found; 字面意思就是没有发现设备,这时候可以首先尝试重启adb服务 C:\Users\username\Ap ...

  6. Codeforces 877F Ann and Books 莫队

    转换成前缀和, 预处理一下然后莫队. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...

  7. Nginx反向代理的基本配置

    (1)proxy_pass 语法:proxy_pass URL; 配置块:location.if 此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式,例如: ...

  8. day 55 jQuery-part2

    这里有一个DOM对象转换成jQuery对象的方法,在jQuery对象后面加上索引值0即可得到效果如图所示: $("#btn")[0] 这里我们这里的索引值为0 只是一种写法而已,只 ...

  9. SpringBoot统一错误处理

    1.处理错误请求页面 import org.springframework.stereotype.Controller; import org.springframework.web.bind.ann ...

  10. php mysql 编码问题

    php mysql 编码问题 问题: PHP从数据库中读取数据,并echo出来,数据中文显示正常:但是echo出新定义的中文字符串,新定义的字符串会乱码. 由此可能是数据库中提取出来的中文编码和php ...