URAL-1979 Resources Distribution

本文介绍了一种特殊正方体数独构造方法,通过确保每个小方格内的数字唯一且满足特定条件,实现了所有绕圈路径上的数字之和相等。文章提供了构造算法及其实现代码。
一个正方体每个面分为n*n个小方块,每个小方块填上1~6*n*n的数字,要求所有方块数字不一样且绕一圈数字和相同。

容易知道所有的绕圈方式一共有3*n种,而这些绕圈方式每个方块一共会被遍历两次,所以可以计算                                      (1+6*n*n)*6*n*n/2(所有数字和)*2=3*n*S(S为一圈的数字和)

         得S=2*n*(1+6*n*n)。

我们可以考虑一个方块和其对面的方块,他们两个在绕圈计算的时候都会被计算上,所以我们只要让对面的两个方块的和为定值即可,这个定值X满足

         S*2=X*4*n可推出X=1+6*n*n

这样就可以构造出来一种满足题设的情况了,直接遍历一遍打印即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<bitset>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<utility>
#define INF 0x3f3f3f3f
#define inf 2*0x3f3f3f3f
#define llinf 1000000000000000000
#define pi acos(-1.0)
#define mod 1000000007
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define per(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define lb(x) (x&-x)
#define gi(x) scanf("%d",&x)
#define gi2(x,y) scanf("%d%d",&x,&y)
#define gll(x) scanf("%lld",&x)
#define gll2(x,y) scanf("%lld%lld",&x,&y)
#define gc(x) scanf("%c",&x)
#define gc2(x,y) scanf("%c%c",&x,&y)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>P;
/***********************************************/
int  n;
int main()
{
    cin>>n;
    rep(i,0,n)
    {
        rep(j,0,n)
        {
            printf("%d ",i*n+j+1);
        }
        printf("\n");
    }
    rep(i,0,n)
    {
        rep(j,0,2*n)
        {
            printf("%d ",n*n+2*n*i+j+1);
        }
        rep(j,0,n)
        {
            printf("%d ",5*n*n-(2*i+1)*n+j+1);
        }
        rep(j,0,n)
        {
            printf("%d ",5*n*n-(2*i+2)*n+j+1);
        }
        printf("\n");
    }
    rep(i,0,n)
    {
        rep(j,0,n)
        {
            printf("%d ",5*n*n+(i+1)*n-j);
        }
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值