魔方阵算法及C语言实现

合集下载

《C语言程序》课程设计报告书-魔方阵程序设计

《C语言程序》课程设计报告书-魔方阵程序设计

吉林工程技术师范学院《C语言程序》课程设计报告书设计题目:魔方阵程序设计专业:计算机科学与技术班级:1054学生姓名:学号:21指导教师:xx2011年1月信息工程学院摘要我的实验题目是对C语言程序设计——魔方阵的编写,主要的功能是实现每一行,每一列以及对角线的相加结果相同,而且每一个数字均不相等。

本次实验能够充分的考核我们对C语言的学习程度以及动手操作能力,对我们提高C语言的能力有极大的帮助,所以这次实验也是十分有必要的。

我的设计内容就是利用循环语句,以及判断条件等函数的合理使用,通过不断的运行,调试,输出,对本程序进行合理的解决,对魔方阵进一步的了解掌握。

关键字:C语言魔方阵程序设计目录摘要................................................. 第1章概述 (1)第2章系统分析 (2)2.1 技术分析 (2)2.2 功能分析 (2)第3章总体设计与详细设计 (3)3.1 系统总体设计 (3)3.2 详细设计 (4)第4章编码实现 (6)4.1 数据输入部分代码设计 (6)4.2 运算部分代码设计 (6)4.3 输出部分代码设计 (7)第5章系统调试 (9)5.1 程序运行结果 (9)5.2 调试过程中的问题与对策 (10)第6章设计总结 (10)参考资料 (12)致谢 (12)附录:1 源代码 (13)2 附图 (14)第1章概述本次实验报告十分有意义,对巩固C语言的学习有很大的帮助。

作用:我的实验课题是魔方阵(魔方阵是一个奇数行列式方阵),主要是实现一行,一列,对角线的和都相等。

意义、帮助:1、能够熟练掌握if、if…else、if…else if语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句实现分支选择结构。

2、能够熟练掌握while语句和for语句格式及使用方法,掌握循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。

魔方阵C语言设计方法及设计理念

魔方阵C语言设计方法及设计理念

與奇數魔術方陣相同,在於求各行、各列與各對角線的和相等,而這次方陣的維度是4的倍數。

先來看看4X4方陣的解法:簡單的說,就是一個從左上由1依序開始填,但遇對角線不填,另一個由左上由16開始填,但只填在對角線,再將兩個合起來就是解答了;如果N大於2,則以4X4為單位畫對角線:至於對角線的位置該如何判斷,有兩個公式,有興趣的可以畫圖印證看看,如下所示:if(i%4==j%4||(i%4+j%4==3)//zaiduijiaoxianshangC方陣的維度整體來看是偶數,但是其實是一個奇數乘以一個偶數,例如6X6,其中6=2X3,我們也稱這種方陣與單偶數方陣。

如果您會解奇數魔術方陣,要解這種方陣也就不難理解,首先我們令n=2(2m+1),並將整個方陣看作是數個奇數方陣的組合,如下所示:首先依序將A、B、C、D四個位置,依奇數方陣的規則填入數字,填完之後,方陣中各行的和就相同了,但列與對角線則否,此時必須在A-D與C- B之間,作一些對應的調換,規則如下:1.將A中每一列(中間列除外)的頭m個元素,與D中對應位置的元素調換。

2.將A的中央列、中央那一格向左取m格,並與D中對應位置對調3.將C中每一列的倒數m-1個元素,與B中對應的元素對調舉個實例來說,如何填6X6方陣,我們首先將之分解為奇數方陣,並填入數字,如下所示:接下來進行互換的動作,互換的元素以不同顏色標示,如下:由於m-1的數為0,所以在這個例子中,C-B部份並不用進行對調。

C將1到n(為奇數)的數字排列在nxn的方陣上,且各行、各列與各對角線的和必須相同,如下所示:填魔術方陣的方法以奇數最為簡單,第一個數字放在第一行第一列的正中央,然後向右(左)上填,如果右(左)上已有數字,則向下填,如下圖所示:一般程式語言的陣列索引多由0開始,為了計算方便,我們利用索引1到n的部份,而在計算是向右(左)上或向下時,我們可以將索引值除以n值,如果得到餘數為1就向下,否則就往右(左)上,原理很簡單,看看是不是已經在同一列上繞一圈就對了。

魔方阵算法及C语言实现

魔方阵算法及C语言实现

魔⽅阵算法及C语⾔实现1 魔⽅阵概念是指由1,2,3……n2填充的,每⼀⾏、每⼀列、对⾓线之和均相等的⽅阵,阶数n = 3,4,5…。

魔⽅阵也称为幻⽅阵。

例如三阶魔⽅阵为:魔⽅阵有什么的规律呢?魔⽅阵分为奇幻⽅和偶幻⽅。

⽽偶幻⽅⼜分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。

下⾯分别进⾏介绍。

2 奇魔⽅的算法2.1 奇魔⽅的规律与算法奇魔⽅(阶数n = 2 * m + 1,m =1,2,3……)规律如下: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相同。

2.2 奇魔⽅算法的C语⾔实现1 #include <stdio.h>2// Author: /3// N为魔⽅阶数4#define N 1156int main()7 {8int a[N][N];9int i;10int col,row;1112 col = (N-1)/2;13 row = 0;1415 a[row][col] = 1;1617for(i = 2; i <= N*N; i++)18 {19if((i-1)%N == 0 )20 {21 row++;22 }23else24 {25// if row = 0, then row = N-1, or row = row - 126 row--;27 row = (row+N)%N;2829// if col = N, then col = 0, or col = col + 130 col ++;31 col %= N;32 }33 a[row][col] = i;34 }35for(row = 0;row<N;row++)36 {37for(col = 0;col < N; col ++)38 {39 printf("%6d",a[row][col]);40 }41 printf("\n");42 }43return0;44 }3 偶魔⽅的算法偶魔⽅的情况⽐较特殊,分为阶数n = 4 * m(m =1,2,3……)的情况和阶数n = 4 * m + 2(m = 1,2,3……)情况两种。

C语言实现魔方阵

C语言实现魔方阵

(1)魔方阵 ①问题描述魔方阵是一个古老的智力问题,它要求在一个m ×m 的矩阵中填入1~m 2的数字(m 为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。

②基本要求● 输入魔方阵的行数m ,要求m 为奇数,程序对所输入的m 作简单的判断,如m 有错,能给出适当的提示信息。

● 实现魔方阵。

● 输出魔方阵。

③实现提示本实验使用的数据结构是数组。

解魔方阵问题的方法很多,这里采用如下规则生成魔方阵。

● 由1开始填数,将1放在第0行的中间位置。

● 将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况:✧ 左上角超出上方边界,则在最下边相对应的位置填入下一个数字; ✧ 左上角超出左边边界,则在最右边相应的位置填入下一个数字; ✧ 如果按上述方法找到的位置已填入数据,则在同一列下一行填入下一个数字。

以3×3魔方阵为例,说明其填数过程,如图2所示。

图2 三阶魔方阵的生成过程由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(x-1,y-1),如果x-1≥0,不用调整,否则将其调整为x-1+m ;同理,如果y-1≥0,不用调整,否则将其调整为y-1+m 。

所以,位置(x,y)的左上角的位置可以用求模的方法获得,即:x=(x-1+m)%my=(y-1+m)%m如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。

这里需要注意的是。

此时的x和y已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x需要跨越两行,y需要跨越一列,即:x=(x+2)%my=(y+1)%m源代码:#include<stdio.h>void mofangzhen(int m){int a[100][100];int b,x,y;for(x=0;x<m;x++){for(y=0;y<m;y++)a[x][y]=0;}x=0;y=(m-1)/2;a[x][y]=1;for(b=2;b<=m*m;b++){if(x-1<0) x=(x-1+m)%m;else x=x-1;if(y-1<0) y=(y-1+m)%m;else y=y-1;if(a[x][y]!=0){x=(x+2)%m;y=(y+1)%m;}a[x][y]=b;}for(x=0;x<m;x++){for(y=0;y<m;y++)printf("%4d",a[x][y]);printf("\n");}}void main(){int m;m=0;while(m%2!=1){printf("请输入矩阵阶数m(奇数):");scanf("%d",&m);if(m%2!=1)printf("m输入错误\n");}mofangzhen(m);}。

C语言实现奇数阶魔方阵的方法

C语言实现奇数阶魔方阵的方法

C语⾔实现奇数阶魔⽅阵的⽅法本⽂实例讲述了C语⾔实现奇数阶魔⽅阵的⽅法。

分享给⼤家供⼤家参考。

具体实现⽅法如下:复制代码代码如下:#include "stdio.h"#include "string.h"#include "stdlib.h"#define N 5void main(){int a[N][N]={0};int i,j;int k;i = 0;j = N/2;a[0][j]=1;for(k = 2; k <= N*N; k++){if( i == 0 && j == N-1 ){//先判断前⼀个数是不是最右上⾓的数,若是后⼀个数直接填在前⼀个数下⽅i=i+1;a[i][j] = k;continue;}i = (i-1+N)%N;//计算前⼀个数右上⾓的坐标j = (j+1)%N;if(a[i][j] != 0){//若前⼀个数的右上⾓有元素,后⼀个数直接填在前⼀个数下⽅i = ((i+1)%N+1)%N;//恢复坐标j = (j-1+N)%N;a[i][j] = k;}else{//上述条件均不满⾜,后⼀个数放在前⼀个数的右上⾓a[i][j] = k;}}for(i = 0; i < N; i++){for(j = 0; j < N; j++){printf("M",a[i][j]);}printf("\n");}}测试数据如下:N = 38 1 63 5 74 9 2希望本⽂所述对⼤家的C语⾔程序设计有所帮助。

魔方矩阵magic square (C语言程序)

魔方矩阵magic square (C语言程序)

/*#include<stdio.h>#define N 7*/#include<iostream>using namespace std;int main(){int N;cout<<"请输入魔方矩阵的阶数N:"<<endl;cin>>N;int matrix[N][N];int row,col;int i,m,n;//0.初始化数组元素全部为0for(row=0;row<N;row++){for(col=0;col<N;col++){matrix[row][col]=0;}}//1.定位1的初始位置row=0;col=(N-1)/2;matrix[row][col]=1;//2.将2...N*N每个数插入到相应位置for(i=2;i<=N*N;i++){int r,c;r=row;c=col;row=(row+N-1)%N; //行列坐标的计算,算法难点。

col=(col+N+1)%N; //后一个数位于前一个数的上一行下一列if(0==matrix[row][col]) //该处无数,无冲突,直接插入该数matrix[row][col]=i;else //此处已经插入了树,则插入到这个位置的下一行{r=(r+1)%N;matrix[r][c]=i;row=r; //重新定位此时的行和列数col=c;}}//3.输出魔方矩阵printf("\n%d阶魔方矩阵如下:\n",N);for(m=0;m<=N;m++){printf("===="); //每个位置占用4个字节}printf("\n");for(m=0;m<N;m++){for(n=0;n<N;n++)printf("%4d",matrix[m][n]); //%4d输出占用4个字节的空间,不足部分用空格在左侧补齐。

魔方阵 C语言

魔方阵 C语言

一、幻方按照阶数可分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。

二、奇数阶幻方(劳伯法)奇数阶幻方最经典的填法是罗伯法。

填写的方法是:把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:(1)每一个数放在前一个数的右上一格;(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;(5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

例,用该填法获得的5阶幻方:三、单偶数阶幻方(斯特拉兹法)所谓单偶阶幻方就是当n不可以被4整除时的偶阶幻方,即4K+2阶幻方。

如(n=6,10,14……)的幻方。

单偶数阶幻方最经典的填法是斯特拉兹法。

填写的方法是:以10阶幻方为例。

这时,k=2。

(1)把魔方阵分为A,B,C,D四个象限,这样每一个象限肯定是奇数阶。

用罗伯法,依次在A象限,D象限,B象限,C象限按奇数阶幻方的填法填数。

(2)在A象限的中间行、中间格开始,按自左向右的方向,标出k格。

A象限的其它行则标出最左边的k格。

将这些格,和C象限相对位置上的数互换位置。

(3)在B象限所有行的中间格,自右向左,标出k-1格。

(注:6阶幻方由于k-1=0,所以不用再作B、D象限的数据交换),将这些格,和D象限相对位置上的数互换位置。

四、源代码如下,已加详细注释#include<stdio.h>#include<stdlib.h>int array[15][15];intinit(int degree) //初始化{inti;int j;for(i=0; i<=degree+1; i++)for(j=0; j<=degree+1; j++)array[i][j] = 0;return 0;}inttest_print(int x, int y, int w, int h) //测试用的,输出以(x,y)为原点,宽为w,高为h,这个区域的数值{inti;int j;for(i=y; i<=y+h-1; i++){for(j=x; j<=x+w-1; j++){printf("%2d ",array[i][j]);}printf("\n");}return 0;}intlao_bo_er(int degree, int x, int y, intnum) //劳伯法{inti;int j;int k;i = y;j = degree/2 + x;for(k=num; k<=num+degree*degree-1; k++){array[i][j] = k;if((k-num+1)%degree == 0){ //如果这个数所要放的格已经有数填入i = (i-y+1)%degree+y;}else{ //每一个数放在前一个数的右上一格i = (i-y-1+degree)%degree+y;j = (j-x+1)%degree+x;}}return 0;}intseq_range(int degree) //把数字按顺序填{inti;int j;intnum;num = 1;for(i=1; i<=degree; i++){for(j=1; j<=degree; j++){array[i][j] = num++;}}return 0;}intsi_te_la_zi(int degree, int x, int y, intnum) //斯特拉兹法{intdeg;int k;int temp;inti;int j;deg = degree/2;lao_bo_er(deg, x, y, num); //用罗伯法,依次在A象限,D象限,B象限,C象限按奇数阶幻方的填法填数lao_bo_er(deg, x+deg, y, num+2*deg*deg);lao_bo_er(deg, x, y+deg, num+3*deg*deg);lao_bo_er(deg, x+deg, y+deg, num+deg*deg);k = (degree-2)/4;for(i=1; i<=deg; i++){ //A象限和C象限对换数据for(j=1; j<=k; j++){temp = array[i][j];array[i][j] = array[i+deg][j];array[i+deg][j]=temp;}for(j=deg+deg/2+1; j>=deg+deg/2-k+3; j--){temp = array[i][j];array[i][j] = array[i+deg][j];array[i+deg][j]=temp;}}for(i=j=1; j<=deg/2+k; j++){ //B象限和D象限对换数据temp = array[i+deg/2][j];array[i+deg/2][j] = array[i+deg+deg/2][j];array[i+deg+deg/2][j]=temp;}return 0;}inthai_er_fa(int degree) //海尔法{inti;int j;int complement;intdeg;seq_range(degree);complement = degree*degree+1;deg = degree/4;for(i=0; i<deg; i++){for(j=0; j<deg; j++){ //对角线上的数字换成和它互补的数array[i*4+1][j*4+1] = complement -array[i*4+1][j*4+1];array[i*4+1][j*4+4] = complement -array[i*4+1][j*4+4];array[i*4+4][j*4+1] = complement -array[i*4+4][j*4+1];array[i*4+4][j*4+4] = complement -array[i*4+4][j*4+4];array[i*4+2][j*4+2] = complement -array[i*4+2][j*4+2];array[i*4+2][j*4+3] = complement -array[i*4+2][j*4+3];array[i*4+3][j*4+2] = complement -array[i*4+3][j*4+2];array[i*4+3][j*4+3] = complement -array[i*4+3][j*4+3];}}return 0;}int main(){int degree;printf("please input the degree\n");scanf("%d",&degree);init(degree);if(degree%2 == 1){ //奇数阶幻方lao_bo_er(degree,1,1,1);test_print(1,1,degree,degree);}else if(degree%4 == 2){ //双偶阶幻方si_te_la_zi(degree, 1, 1, 1);test_print(1,1,degree,degree);}else{ //单偶阶幻方hai_er_fa(degree);test_print(1,1,degree,degree);}return 0;}。

输出魔方阵

输出魔方阵
for(i=0;i<n;i++)//各列的和
for(j=0;j<n;j++)a[n][i]+=a[j][i];
for(i=0;i<n;i++)a[n][n]+=a[i][i];//主对角线的和
}
void main()
{
int n;
int a[M][M]={0};
printf("魔方阵的阶数n=");//n为大于2的任意整数
}
}
//三、当n为单偶数(n=4k+2)时,可把方阵分为4个2k+1的小方阵,编号如下:
//1.各小方阵按奇数阶算法依次填入A(1…[2k+1]2)、B([2k+1]2+1…2[2k+1]2)、C(…)、D(…4[2k+1]2);
//2.将A与D换:A中间格始向右取k格;A最左边的k列(除中行);
//3.将C与B互换:从C的中间列开始向左数k-1列。
MagicOdd(a,0,m,2*m*m+1,m);//C阵(右上)
MagicOdd(a,m,0,3*m*m+1,m);//D阵(左下)
for(j=k;j<m-1;j++){//从A的中间格开始向右数k格...
t=a[k][j];
a[k][j]=a[k+m][j];//...与D对应位置交换
a[k+m][j]=t;
}
void MagicSev(int a[M][M],int st,int n)//单偶4k+2阶魔方阵,起始数st
{
int m=n/2,k=m/2;//将原矩阵分为2×2的方阵
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

魔方阵算法及C语言实现1 魔方阵概念魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n = 3,4,5…。

魔方阵也称为幻方阵。

例如三阶魔方阵为:魔方阵有什么的规律呢?魔方阵分为奇幻方和偶幻方。

而偶幻方又分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。

下面分别进行介绍。

2 奇魔方的算法2.1 奇魔方的规律与算法奇魔方(阶数n = 2 * m + 1,m =1,2,3……)规律如下: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相同。

2.2 奇魔方算法的C语言实现1 #include <stdio.h> 2// Author: / 3// N为魔方阶数 4#define N 115 6int main()7{8int a[N][N]; 9int i;10 int col,row;1112 col = (N-1)/2;13 row = 0;1415a[row][col] = 1;1617for(i = 2; i <= N*N; i++)18 {19if((i-1)%N == 0 )20 {21 row++;22 }23else24 {25// if row = 0, then row = N-1, or row = row - 126 row--;27 row = (row+N)%N;2829// if col = N, then col = 0, or col = col + 130 col ++;31 col %= N;32 }33 a[row][col] = i;34 }35for(row = 0;row<N;row++)36 {37for(col = 0;col < N; col ++)38{39 printf("%6d",a[row][col]);40 }41printf("\n");42 }43return0;44 }3 偶魔方的算法偶魔方的情况比较特殊,分为阶数n = 4 * m(m =1,2,3……)的情况和阶数n = 4 * m + 2(m = 1,2,3……)情况两种。

3.1 阶数n = 4 * m(m =1,2,3……)的魔方(双偶魔方)算法1:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下:1.按数字从小到大,即1,2,3……n2顺序对魔方阵从左到右,从上到下进行填充;2.将魔方中间n/2列的元素上、下进行翻转;3.将魔方中间n/2行的元素左、右进行翻转。

C语言实现1 #include <stdio.h> 2// Author: / 3// N为魔方阶数, 4#define N 12 5 6int main() 7{ 8int a[N][N];//存储魔方 9 int i, temp;//临时变量10int col, row;//col 列,row 行1112//初始化13 i = 1;14for(row = 0;row < N; row++)15 {16for(col = 0;col < N; col ++)17 {18 a[row][col] =i;19 i++;20 }21 }2223//翻转中间列24for(row = 0; row < N/2; row ++)25 {26for(col = N/4;col < N/4*3;col ++)27 {28 temp = a[row][col];29 a[row][col] =a[N-row-1][col];30 a[N-row-1][col] =temp;31 }32 }3334//翻转中间行35for(col = 0; col < N/2; col ++)36 {37for(row = N/4;row < N/4* 3;row ++)38 {39 temp = a[row][col];40 a[row][col] =a[row][N-col-1];41 a[row][N-col-1] =temp;42 }43 }4445for(row = 0;row < N; row++)46{47for(col = 0;col < N; col ++)48 {49printf("%5d",a[row][col]);50 }51printf("\n");52 }53return0;54 }算法2:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下:1.按数字从小到大,即1,2,3……n2顺序对魔方阵从左到右,从上到下进行填充;2.将魔方阵分成若干个4×4子方阵,将子方阵对角线上的元素取出;3.将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。

C语言实现1 #include <stdio.h> 2// Author: / 3// N为魔方阶数 4#define N 12 5 6int main() 7{ 8int a[N][N];//存储魔方 9 int temparray[N*N/2];//存储取出的元素10int i;//循环变量11int col, row;// col 列,row 行1213//初始化14 i = 1;15 for(row = 0;row < N; row++)16 {17for(col = 0;col < N; col ++)18 {19 a[row][col] = i;20i++;21 }22 }23//取出子方阵中对角线上的元素,且恰好按从小到大的顺序排放24 i = 0;25for(row = 0;row < N; row++)26 {27for(col = 0;col < N; col ++)28 {29if((col % 4== row % 4) || ( 3== ( col % 4+ row % 4)))30 {31 temparray[i] = a[row][col];32i++;33 }34 }35 }36//将取出的元素按照从大到小的顺序填充到n×n方阵中37 i = N*N/2 -1;38for(row = 0;row < N; row++)39 {40for(col = 0;col < N; col ++)41 {42 if((col % 4== row % 4) || ( 3== ( col % 4+ row % 4)))43 {44 a[row][col] = temparray[i];45i--;46 }47 }48 }49//输出方阵50for(row = 0;row < N; row++)51 {52for(col = 0;col < N; col ++)53 {54printf("%5d",a[row][col]);55 }56printf("\n");57 }58return0;59 }3.2 阶数n = 4 * m + 2(m =1,2,3……)的魔方(单偶魔方)算法设k = 2 * m + 1;单偶魔方是魔方中比较复杂的一个。

1.将魔方分成A、B、C、D四个k阶方阵,如下图这四个方阵都为奇方阵,利用上面讲到的方法依次将A、D、B、C填充为奇魔方。

2.交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素;对其他行,交换从左向右m列各对应元素。

3.交换B、D魔方元素,交换从中间列向左m – 1列各对应元素。

C语言实现#include <stdio.h>// Author: /// N为魔方阶数#define N 10int main(){int a[N][N] = { {0} };//存储魔方int i,k,temp;int col,row;// col 列,row 行//初始化k = N / 2;col = (k-1)/2;row = 0;a[row][col] = 1;//生成奇魔方Afor(i = 2; i <= k*k; i++){if((i-1)%k == 0 )//前一个数是3的倍数 {row++;}else{// if row = 0, then row = N-1, or row = row - 1row--;row = (row+k)%k;// if col = N, then col = 0, or col = col + 1col ++;col %= k;}a[row][col] = i;}//根据A生成B、C、D魔方for(row = 0;row < k; row++){for(col = 0;col < k; col ++){a[row+k][col+k] = a[row][col] + k*k;a[row][col+k] = a[row][col] + 2*k*k;a[row+k][col] = a[row][col] + 3*k*k;}}// Swap A and Cfor(row = 0;row < k;row++){if(row == k / 2)//中间行,交换从中间列向右的m列,N = 2*(2m+1) {for(col = k / 2; col < k - 1; col++){temp = a[row][col];a[row][col] = a[row + k][col];a[row + k][col] = temp;}}else//其他行,交换从左向右m列,N = 2*(2m+1) {for(col = 0;col < k / 2;col++){temp = a[row][col];a[row][col] = a[row + k][col];a[row + k][col] = temp;}}}// Swap B and Dfor(row = 0; row < k;row++)//交换中间列向左m-1列,N = 2*(2m+1) { for(i = 0;i < (k - 1)/2 - 1;i++){temp = a[row][k+ k/2 - i];a[row][k+ k /2 -i] = a[row + k][k+k/2 -i];a[row + k][k+k/2 -i] = temp;}}//输出魔方阵for(row = 0;row < N; row++){for(col = 0;col < N; col ++){printf("%5d",a[row][col]);}printf("\n");}return0;}==========================================》#include <stdio.h>#define N 16 //这里可以修改N的值,并且N只能为奇数int main(){int a[N][N]={0},i,j,k,p,m,n;p=1;while(p==1){printf("Enter n(1~%d): ",N-1);/*可以输入小于等于N-1的奇数*/ scanf("%d",&n);if((n!=0)&&(n<N)&&(n%2!=0)) p=0;}i=n+1;j=n/2+1; /*建立魔方阵*/a[1][j]=1;for(k=2;k<=n*n;k++){i=i-1;j=j+1;if((i<1)&&(j>n)){i=i+2;j=j-1;}else{if(i<1)i=n;if(j>n) j=1;}if(a[i][j]==0) a[i][j]=k;else{i=i+2;j=j-1;a[i][j]=k;}}for(i=1;i<=n;i++)/*输出魔方阵*/{for(j=1;j<=n;j++)printf("%4d",a[i][j]);printf("\n");}}将1~n的平方这几个数构成一个n阶魔方阵。

相关文档
最新文档