列表

详情


NC229805. Remake

描述

      众所周知,如果你想成为一名实验室队员,有一定的算法能力是必须的,而一定的算法能力之前,面对比赛成功或者失败之后的调整能力也是必须的。

      再经历了一次次大赛之后,众多ahu的实验室队员也是一步步加入到了重新提升自己与改变自己行列当中去,那么作为实验室最为垃圾的成员小c也自然加入到了remake的行列当中去了。

      对于小c,作为一位读着毫无生产力的数学系学生,导致他对于如何remake,觉得需要更加量化的解决手段。正好他正在学习《马原》有关的知识,意识到人类的发展类似于一个螺旋发展,于是小c决定将自己的内在,具象化成一个不经典的螺旋方阵。以下为一个4x4螺旋矩阵的例子。

其中:1=1;3=1+2;6=1+2+3;.......120=1+2+3+4+5+......+14+15;    136=1+2+3+4+5....+16
量化成一个螺旋方阵后,小c考虑到,若是remake,那么只需要将这个量化方阵做一次对称变换就好啊!因此他以整个方阵竖直方向的中心线为轴做了一次对称变换,下面是4x4的方阵的例子
       

作为一位唯物主义者,小c明白量变引起质变的道理,因此小cnxn方阵可能会比较大,因此他希望,作为拯救实验室的你,能够在他p次remake后,给出具体的矩阵。

其中,第4n+14n+2次remake是以整个方阵竖直方向的中心线为轴做一次对称变换,第4n+34n+4次是以整个方阵水平方向的中心线为轴做一次对称变换。(n为自然数,n0 1 2 3 4……

输入描述

第一行一个整数n,代表是nxn的内心方阵

第二行一个整数p,代表是remake的次数

(n,p<=1000)

输出描述

n行n列,输出经过p次remake后对应的矩阵

示例1

输入:

4
1

输出:

10 6 3 1 
15 105 91 78 
21 120 136 66 
28 36 45 55

示例2

输入:

4
3

输出:

55 45 36 28 
66 136 120 21 
78 91 105 15 
1 3 6 10

原站题解

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

C 解法, 执行用时: 69ms, 内存消耗: 14712K, 提交时间: 2021-11-24 21:38:36

#include<stdio.h>
int main()
{
	long n,p,a[1000][1000],i,j,s=0,k=1;
	scanf("%ld %ld",&n,&p);
	p%=4;
	for(i=0;i<n/2;i++)
	{
		for(j=i;j<n-1-i;j++)
		{
			s+=k++;
			a[i][j]=s;
		}
		for(j=i;j<n-1-i;j++)
		{
			s+=k++;
			a[j][n-1-i]=s;
		}
		for(j=i;j<n-1-i;j++)
		{
			s+=k++;
			a[n-1-i][n-1-j]=s;
		}
		for(j=i;j<n-1-i;j++)
		{
			s+=k++;
			a[n-1-j][i]=s;
		}
	}
	if(n%2)
		a[n/2][n/2]=s+k;
	if(p==1)
		for(i=0;i<n;i++)
			for(j=0;j<n/2;j++)
				s=a[i][j],a[i][j]=a[i][n-1-j],a[i][n-1-j]=s;
	if(p==3)
		for(i=0;i<n;i++)
			for(j=0;j<n/2;j++)
				s=a[j][i],a[j][i]=a[n-1-j][i],a[n-1-j][i]=s;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			printf("%ld ",a[i][j]);
		printf("\n");
	}
}

C++ 解法, 执行用时: 3ms, 内存消耗: 400K, 提交时间: 2021-11-18 14:27:19

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,p,x,y;
    scanf("%d%d%d%d",&n,&p,&x,&y);
    p%=4;
    if(p==1) y=n-y+1;
    if(p==3) x=n-x+1;
    int t=min(x,min(y,min(n-x+1,n-y+1)));
    long long ans;
    if(x<=y) ans=1ll*t*(4ll*(n-1)-4ll*t)+10ll*t-4ll*n-3ll+x+y;
    else ans=1ll*t*(4ll*n-4ll*t)+2ll*t+1-x-y;
    printf("%lld\n",ans);
}

上一题