栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

信息学奥赛一本通(C++版)在线评测系统 1967:【14NOIP普及组】螺旋矩阵

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

信息学奥赛一本通(C++版)在线评测系统 1967:【14NOIP普及组】螺旋矩阵

【题目描述】

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

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

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

11223344
12121313141455
11111616151566
1010998877

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

【输入】

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

【输出】

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

【输入样例】
4 2 3

【输出样例】
14

【提示】

【数据说明】

对于 50%的数据,1  ≤  n  ≤  100;

对于 100%的数据,1  ≤  n  ≤  30,000,1  ≤  i  ≤  n,1  ≤  j  ≤  n。

这道题为学代码的everybody中常见的一道题——螺旋矩阵。

此题容易出错,读者请谨慎。

以下是我的代码,代码中有详细解析↓↓↓

#include
using namespace std;
int getNum(int l, int i, int j)//左上角(1,1)位置的值为1,边长为l的矩阵中(i,j)的值
{
	if(i == 1)//如果在上边 
		return j;
	else if(j == l)//如果在右边 
		return l-1+i;
	else if(i == l)//如果在下边 
		return 2*(l-1)+l-j+1;
	else if(j == 1)//如果在左边 
		return 3*(l-1)+l-i+1;
	else//如果在内部 i,j位置的值为这一圈元素的个数(4*(l-1))加上以(2,2)位置为左上角,以l-2长度为边的矩阵中,(i-1,j-1)位置的值。 
		return 4*(l-1)+getNum(l-2, i-1, j-1);//以(2,2)位置为左上角时, 原(2,2)变为(1,1),原(i,j)变为(i-1,j-1) 
}
int main()
{
    int n, ai, aj;//求(ai,aj)的数 st:该圈起始数字 
    cin >> n >> ai >> aj;
    cout << getNum(n, ai, aj);
    return 0;
}

此题为信息学奥赛一本通(C++版)在线评测系统 1967:【14NOIP普及组】螺旋矩阵

这道题的代码其实比较短,重在考虑思路,思路搞懂后这道题便轻松解决哦!!!

谢谢大家━((*′д`)爻(′д`*))━!!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034694.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号