魔方阵

魔方阵

蹲街弑〆低调 提交于 2020-02-04 06:26:56
魔方阵N: 奇数规律如下: 1、数字1位于方阵中的第一行中间一列; 2、数字a(1 < a ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为n; 3、数字a(1 < a ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为1; 4、如果a-1是n的倍数,则a(1 < a ≤ n2)的行数比a-1行数大1,列数与a-1相同。 4N型: 1、按数字从小到大,即1,2,3……n2顺序对魔方阵从左到右,从上到下进行填充; 2、将魔方阵分成若干个4×4子方阵,将子方阵对角线上的元素取出; 3、将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。 单偶数型:(4N+2型) 1、把魔方阵分为A,B,C,D四个象限,这样每一个象限肯定是奇数阶。用奇数阶象限的填充数字的方法(罗伯法),依次在A象限,D象限,B象限,C象限填数 2、在A象限的中间行、中间格开始,按自左向右的方向,标出n格(4n+2=ROW)。A象限的其他行则标出最左边的n格(4n+2=ROW)。将这些格,和C象限的相对位置上的数互换位置。 3、在B象限所有行的中间格,自左向右,标出n-1格(4n+2=ROW)(注:6阶幻方由于n-1=0,所以不用再作B、D象限的数据交换),将这些格,和D象限相对位置上的数互换位置。 (详细解答可参考 https://blog.csdn.net/yy_0733

C++经典算法题-4N魔方阵

两盒软妹~` 提交于 2020-01-26 03:28:57
50.Algorithm Gossip: 4N魔方阵 说明 与奇数魔术方阵 相同,在于求各行、各列与各对角线的和相等,而这次方阵的维度是4的倍数。 解法 先来看看4X4方阵的解法: 简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了;如果N大于2,则以 4X4为单位画对角线: 至于对角线的位置该如何判断,有两个公式,有兴趣的可以画图印证看看,如下所示: 左上至右下: j % 4 == i % 4 右上至左下: ( j % 4 + i % 4 ) == 1 代码示例 # include <stdio.h> # include <stdlib.h> # define N 8 int main ( void ) { int i , j ; int square [ N + 1 ] [ N + 1 ] = { 0 } ; for ( j = 1 ; j <= N ; j ++ ) { for ( i = 1 ; i <= N ; i ++ ) { if ( j % 4 == i % 4 || ( j % 4 + i % 4 ) == 1 ) square [ i ] [ j ] = ( N + 1 - i ) * N - j + 1 ; else } } square [ i ] [ j ] = ( i - 1 ) *

数据结构设计——魔方阵【绝对整理清楚】

我的未来我决定 提交于 2020-01-18 00:13:04
魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m*m的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示: 程序: #include<stdio.h> #include<stdlib.h> #include<string.h> #define M 100 int main() { int a[M][M]; memset(a,0,sizeof(0)); int x,y,k,m; printf("输入阶数:"); scanf("%d",&m) ; while(!((m!=0)&&(m<M)&&(m%2!=0))) { printf("错误请重新输入:"); scanf("%d",&m);//m = 3 } x=0; y=(m - 1)/2; a[x][y]=1; for(k=2;k<=m*m;k++){ x=(x-1+m)%m; y=(y-1+m)%m; if(a[x][y]==0){ a[x][y]=k; }else{ x=(x+2)%m; y=(y+1)%m; a[x][y]=k; } } printf("输出的矩阵为:\n"); for(x=0;x<m;x++){ for(y=0;y<m;y++) printf("%d\t",a[x][y]); printf("\n"); } return 0; } 【解析】 首先:题目要求是在 m*m

魔方阵

拈花ヽ惹草 提交于 2019-12-03 11:54:43
定义:     n阶矩阵(n×n),满足每一行、每一列、对角线元素的和相同,n>=3 分类: 1、奇数阶魔方阵 2、双偶数阶魔方阵(4*k) 3、单偶数阶魔方阵(4*k+2) 1、奇数阶魔方阵 1)首行的中间赋值1,arr[0][n/2]=1 2)将2到n 2 依次赋值:整体规律是 行数减一,列数加一 3)特殊情况:行标i=0时,减一后赋值最后一行i=n-1;列标j=n-1时,加一赋值第一列j=0 4)特殊情况:原位置已被占用,则下一个数放在上一个数的下面 1 void GetOddMagic(int arr[][MAX], int n) 2 { 3 int row = 0, col = n / 2, prow, pcol; 4 arr[row][col] = 1; 5 int t = 2; 6 while (t <= n*n) 7 { 8 prow = row, pcol = col;//记录row,col的副本 9 row = row>0 ? (--row) : (n - 1);//行数减一 10 col = col<(n - 1) ? (++col) : 0;//列数加一 11 if (arr[row][col]) 12 { 13 row = prow, col = pcol; 14 arr[++row][col] = t; 15 } 16 else 17 arr[row]