ural1979 Resources Distribution(构造)
题意:
给你一个n(100)阶魔方,共有6*n*n个块,让你填入1-6*n*n这些数字,要求使得从任意点出发朝任意方向绕一圈的和都相等,让你输出魔方 spj
思路:
绕圈每个点被饶了两次,也就是这些块的总贡献是这些数字的和*2,然后圈的数量也是一定的,是3*n,然后每一圈的和是相等的,所以也是固定的一个值
然后发现每个点的两个圈里都有跟他对着的那个点包含在里面,所以对于每个点,只要是他和他对着的那个点的和等于圈的和/2n就可以满足条件了
简直机智。。
/* *********************************************** Author :devil ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <stack> #include <map> #include <string> #include <time.h> #include <cmath> #include <stdlib.h> #define LL long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,a,b) for(int i=a;i>=b;i--) #define ou(a) printf("%d\n",a) #define pb push_back #define mkp make_pair template<class T>inline void rd(T &x) { char c=getchar(); x=0; while(!isdigit(c))c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } #define IN freopen("in.txt","r",stdin); #define OUT freopen("out.txt","w",stdout); using namespace std; const int inf=0x3f3f3f3f; const int mod=1e9+7; const int N=1e2+10; int n,m1[N][N],m2[N][N<<2],now; int main() { #ifndef ONLINE_JUDGE //IN #endif scanf("%d",&n); int all=6*n*n+1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { printf("%d%c",++now,j==n?'\n':' '); m1[n-i+1][j]=all-now; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { printf("%d ",++now); m2[i][n*3-j+1]=all-now; } for(int j=n+1;j<=n*2;j++) { printf("%d ",++now); m2[i][n*5-j+1]=all-now; } for(int j=n*2+1;j<=n*4;j++) printf("%d%c",m2[i][j],j==n*4?'\n':' '); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) printf("%d%c",m1[i][j],j==n?'\n':' '); return 0; }