思路如下:

1.输入n>>a>>b;

2.用一个循环缩小范围求出a,b所示的数所在的圈数q;

3.再一个循环求出圈数q的第1个数的值sum;

4.用四个if判断a,b所示的数在本圈q的上或下或左或右;

5.根据位置求出t(在sum的基础上需要+的值)

6.输出<<sum+t;

代码如下:

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int n,a,b,i,j,q=0,sum=1,t,l;
cin>>n>>a>>b;
for(i=1;i<=n;i++)
if(a>=i&&a<=n-i+1&&b>=i&&b<=n-i+1) q++;
else break;
l=n+2;
for(i=1;i<=q-1;i++)
{
l=n-2*(i-1);
sum=sum+4*(l-1);
}
l=l-2;
if(a==q)
t=b-(q-1)-1;
if(b==n-(q-1))
t=a-(q-1)-1+(l-1);
if(a==n-(q-1))
t=n-(q-1)-b+(l-1)*2;
if(b==q&&a!=q)
t=n-(q-1)-a+(l-1)*3;
cout<<sum+t;
system("pause");
return 0;
}

以上方法摘自码酷

2016.7.9更新更加简单的代码,自己做的,时间复杂度O(1),空间复杂度O(1)。以下是代码:

思路(简单说):注意到矩阵是正方形的,因此可以寻找以矩阵中心点为中心的一个最小的正方形矩阵,要包含准备查找的那个数(说明这个数一定在子矩阵的边界上),把子矩阵外的格子数量算出来,然后在子矩阵的四条边界上找这个点的位置,即可最多只遍历一圈就找到格子的位置。

#include<iostream>
using namespace std;
int n,x,y;
int main(){
scanf("%d%d%d",&n,&x,&y);
int t=min(x-1,y-1);
t=min(t,n-x);
t=min(t,n-y);
int matrix=n-t*2;
int sum=n*n-matrix*matrix;
if(x==t+1) printf("%d",sum+y-t);
else if(y==t+matrix) printf("%d",sum+matrix+x-(t+1));
else if(x==t+matrix) printf("%d",sum+matrix*2-1+(t+matrix)-y);
else if(y==t+1) printf("%d",sum+matrix*3-2+(t+matrix)-x);
system("pause");
return 0;
}

如果不太理解,可以手画一画图试试。

noip201403螺旋矩阵【普及组】数学算法的更多相关文章

  1. 洛谷 P2239 螺旋矩阵(模拟 && 数学)

    嗯... 题目链接:https://www.luogu.org/problem/P2239 这道题首先不能暴力建图,没有简单方法,只有进行进行找规律. AC代码: #include<cstdio ...

  2. SYCOJ246螺旋矩阵

    题目-螺旋矩阵 (shiyancang.cn) noip201403螺旋矩阵[普及组]数学算法 - 大本营 - 博客园 (cnblogs.com) 以下为搬运代码.一个为算圈数,另外一个是数学方法 思 ...

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

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

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

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

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

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

  6. 【LeetCode-面试算法经典-Java实现】【059-Spiral Matrix II(螺旋矩阵II)】

    [059-Spiral Matrix II(螺旋矩阵II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an integer n, generate a ...

  7. C++ 螺旋矩阵算法

    清理磁盘空间的时候翻出了多年前写过的螺旋矩阵,代码效率和水平较低,纪念一下,保存到博客园! // ConsoleApplication3.cpp : 定义控制台应用程序的入口点. // #includ ...

  8. 【算法笔记】B1050 螺旋矩阵

    1050 螺旋矩阵 (25 分)   本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行  ...

  9. 2017.12.10《“剑锋OI”普及组多校联盟系列赛(14)#Sooke#Kornal 的课余时间 》分析报告

    报告内容如下 - - [导语] ------ 太晚了,时间也紧,一切尽量从简吧 PS:本文题目来自剑锋OI 所以废话也不多说,进入正题吧,代码直接跟在题目后边儿,主要分析在代码前,次要的就写在代码后面 ...

随机推荐

  1. 【poj2096】Collecting Bugs

    题目描述 Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other materia ...

  2. ubuntu15.10安装搜狗拼音输入法

    sudo vim /etc/apt/sources.list.d/ubuntukylin.list(我的默认显示没有这个文件将自动创建) 添加源deb http://archive.ubuntukyl ...

  3. .NET 反射概述

    反射      反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性 ...

  4. Swift - UITableView里的cell底部分割线左侧靠边

    override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, ...

  5. win7 打印机共享

    1.在工具->文件夹选项->查看,将"使用简单文件共享"前面的勾勾去掉2.在控制面板->用户帐号,将guest帐户启用3.运行"gpedit.msc&q ...

  6. [译]:Orchard入门——给网站添加新博客

    原文链接:Adding a Blog to Your Site 文章内容基于Orchard 1.8版本 Orchard提供一个博客引擎--这让添加一个新博客到你网站变得非常容易. 本文将介绍怎样添加一 ...

  7. OpenFOAM 学习路线 【转载】

    "Two weeks of playing with a CFD code will save you one afternoon of reading" 什么是OpenFOAM( ...

  8. Java整型与字符串相互转换

    >>>>>>>>>>>>>>>>>>>> 1如何将字串 String 转换成整数 ...

  9. 【Exception—WebForm】当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作。请指定 ServiceNotification 或 DefaultDesktopOnly 样式,以显示服务应用程序发出的通知。

    最近做的项目现在发布到服务器上开始测试了,本地好好的程序,到服务器上却报异常了: 当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作.请指定 ServiceNo ...

  10. 桶装水 送水 消费充值PDA会员管理系统 介绍

    桶装水 送水 消费充值PDA会员管理系统 介绍 主要功能:会员管理临时开卡.新增会员.修改会员.删除会员场馆管理仓管信息管理.租凭信息管理会员卡管理会员卡类型设置.会员发卡.会员信息管理.体验用户发卡 ...