多校第九场Math Geek(构造反幻方+找规律)

本文探讨了如何构造反幻方,即与幻方规律相反的矩阵。对于阶数大于等于5的幻方,通过特定的排列方式,并根据奇偶性调整元素,确保行和、列和、对角线和不为特定数的倍数。对于奇数阶,可以通过调整使某些和变为特定数加减1的形式;对于偶数阶,仅需调整中间的元素。3和4阶的情况可以直接使用样例。此外,还提及了网上的一些其他构造方法,如蛇形排列和随机生成矩阵的搜索策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到敏感的GEEK字样,果断先读了这题,然后演算纸上各种划拉。。。

题意:构造反幻方(貌似就是和幻方相反的意思)。实际就是个简单的找规律,

我的构造方法:当大于等于5阶时,按左到右,上到下顺序放入1到N*N

对幻方的阶数分奇偶讨论下

奇数:行和,列和,对角和都是相应中间数的N倍,满足a*N(a为正整数)所以只有正中间列和行还有对角的4个相等,只需调换相应的几个数使其不为a*N形式,且互不相等即可,由于阶数大于等于5 ,可以找到相应的调换使相应的和变成a*N+1、a*N+2,a*N-1,a*N-2(3阶会出现a*N1-2与a*N2+1相等的情况)。

偶数:行、列对角和都满足4*n+2、这时只有2个对角和能相等,当阶数大于4时直接把中间的4个数随便调换2个就可以了,构造出2个4*n型的数(4阶情况出现2个4*N型数相等的)。

3和4阶的话直接输出样例即可。

构造方法有很多,有在网上找到什么公式的是蛇形排列好像也满足。还有朴素的构造方法就是随机生成矩阵,然后各种搜索变换,直到满足条件为止。

 

代码有点绕直接输出就好

#include <cstdio>
#include <string.h>

int ans[205][205];
int I=0;

void swap (int &a,int &b)
{
     a^=b^=a^=b;
}

int main ()
{
    int n,i,j;
    int cas;
    scanf("%d",&cas);
    while (cas--)
    {
         scanf("%d",&n);
         int t=0;
         for (i=0 ; i<n ; ++i)
          for (j=0 ; j<n ; ++j)
          {
              ans[i][j]=++t;
          }
         if(n==3)
         {
             ans[0][0]=7;ans[0][1]=5;ans[0][2]=2;
             ans[1][0]=1;ans[1][1]=4;ans[1][2]=8;
             ans[2][0]=3;ans[2][1]=6;ans[2][2]=9;
         }
         else if(n==4)
         {
              ans[0][0]=2;ans[0][1]=8;ans[0][2]=15;ans[0][3]=1;
              ans[1][0]=5;ans[1][1]=12;ans[1][2]=10;ans[1][3]=16;
              ans[2][0]=6;ans[2][1]=9;ans[2][2]=4;ans[2][3]=14;
              ans[3][0]=3;ans[3][1]=7;ans[3][2]=11;ans[3][3]=13;
         }
         else 
         if(n&1)
         {
              swap(ans[n/2][n/2],ans[n/2][n/2+1]);
              swap(ans[n/2-1][n/2+1],ans[n/2-1][n/2-1]);
         }
         else
         {
             swap(ans[n/2-1][n/2-1],ans[n/2-1][n/2]);
         }
         printf("Case #%d:\n",++I);
         for (i=0 ; i<n ; ++i)
         {
          int sum=0;
          for (j=0 ; j<n ; ++j)
          {
              printf("%d ",ans[i][j]);
          }
          printf("\n");
         }
    }
    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值