NC229805. Remake
描述
众所周知,如果你想成为一名实验室队员,有一定的算法能力是必须的,而一定的算法能力之前,面对比赛成功或者失败之后的调整能力也是必须的。
再经历了一次次大赛之后,众多ahu的实验室队员也是一步步加入到了重新提升自己与改变自己行列当中去,那么作为实验室最为垃圾的成员小c也自然加入到了remake的行列当中去了。
作为一位唯物主义者,小c明白量变引起质变的道理,因此小c的nxn方阵可能会比较大,因此他希望,作为拯救实验室的你,能够在他p次remake后,给出具体的矩阵。
其中,第4n+1、4n+2次remake是以整个方阵竖直方向的中心线为轴做一次对称变换,第4n+3、4n+4次是以整个方阵水平方向的中心线为轴做一次对称变换。(n为自然数,n取0 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); }