列表

详情


NC16502. [NOIP2014]螺旋矩阵

描述

一个 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

输出:

14

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2018-11-04 10:24:10

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,x,y;
	cin>>n>>x>>y;
	int p=max(abs(n-2*x+1),abs(n-2*y+1))+1;
	if(x>y)
		cout<<n+3*p-x-y+n*n-p*p-1<<endl;
	else
		cout<<p-n+x+y+n*n-p*p-1<<endl;
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 28ms, 内存消耗: 7104K, 提交时间: 2019-12-15 18:42:30

n,i,j=map(int,input().split())
d=min(i-1,j-1,n-i,n-j)
x,y,xx,yy=[i-1,j-1,n-i,n-j]
ans=(n-d)*d*4
if (x==d): ans+=j-d
elif (y==d): ans+=4*n-7*d-2-i
elif (xx==d): ans+=3*n-5*d-j-1
elif (yy==d): ans+=n+i-3*d-1
print (ans)

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 488K, 提交时间: 2020-03-30 21:46:43

#include<bits/stdc++.h>
using namespace std;int n,x,y,p;int main(){cin>>n>>x>>y;p=max(abs(n-2*x+1),abs(n-2*y+1))+1;if(x>y) cout<<n+3*p-x-y+n*n-p*p-1<<endl;else cout<<p-n+x+y+n*n-p*p-1<<endl;}

上一题