题意:

给你一个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;
}