求一个n阶魔方阵的算法用标准c语言的风格来做的
#define sizem ((size / 2 - 1) / 2)
#define sizeh (size / 2)
#define sizesq (sizeh * sizeh)
void main()
{
int size = 0; //幻方大小
int x = 0, y = 0; //下一个数字所放的位置
int i, j; //循环变量
int st_i, st_x = 0, st_y = 0;
int currnum; //构造双偶数阶幻方填数的变量
int temp;
//-----输入幻方大小-------------------------------
while ((size 31) || (size == 2))
{
printf("size of magic square:");
scanf("%d", &size);
}
//-----建立二维动态数组---------------------------
int **a = new int *[size];
for (i=0; i<size; i++)
{
a[i] = new int [size];
}
if (size % 2 == 1)
{
//-----构造奇数阶(2n+1)幻方(连续摆数法)---
x = (size + 1) / 2 - 1; //第一个数字在第一行
y = 0; //的正中间位置
//-----开始填数-------------------------------
for (i=1; i<=size*size; i++)
{
a[y][x] = i;
//-----分析下一个数字的位置---------------
//-----当下一个数是size的倍数时,放在正下方
if (i % size == 0)
{
y++;
}
//-----当超出上面的边界时-----------------
else if (y == 0)
{
x++;
y = size - 1;
}
//-----当超出右面的边界时-----------------
else if (x == size - 1)
{
x = 0;
y--;
}
//-----正常情况下-------------------------
else
{
x++;
y--;
}
}
}
else if (size % 4 == 0)
{
//-----构造双偶数阶(4n)型幻方(对称法)-----
//-----第一步:分区并给分区做标记-------------
for (x=0; x<size/2; x++)
{
for (y=0; y<size/2; y++)
{
if ((x + y) % 2 == 0)
{
a[x][y] = -1;
a[x][size-y-1] = -1;
a[size-x-1][y] = -1;
a[size-x-1][size-y-1] = -1;
}
}
}
//-----第二步:填数-------------------------
for (x=0; x<size; x++)
{
for (y=0; y<size; y++)
{
currnum = x * size + y;
if (a[x][y] == -1)
{
a[x][y] = size * size - currnum;
}
else
{
a[x][y] = currnum + 1;
}
}
}
}
else
{
//-----构造单偶数阶(2(2m+1))幻方(斯特雷奇法)
//-----第一步:构造size/2阶幻方(连续摆数法)-
for (st_i=0; st_i<4; st_i++)
{
switch (st_i)
{
case 0:
st_x = 0;
st_y = 0;
break;
case 1:
st_x = sizeh;
st_y = sizeh;
break;
case 2:
st_x = sizeh;
st_y = 0;
break;
case 3:
st_x = 0;
st_y = sizeh;
break;
default:
break;
}
x = (sizeh + 1) / 2 - 1; //第一个数字在第一行
y = 0; //的正中间位置
//-----开始填数---------------------------
for (i=1; i<=sizesq; i++)
{
a[y+st_y][x+st_x] = i + sizesq * st_i;
//-----分析下一个数字的位置---------------
//-----当下一个数是size的倍数时,放在正下方
if (i % (size / 2) == 0)
{
y++;
}
//-----当超出上面的边界时-----------------
else if (y == 0)
{
x++;
y = size / 2 - 1;
}
//-----当超出右面的边界时-----------------
else if (x == size / 2 - 1)
{
x = 0;
y--;
}
//-----正常情况下-------------------------
else
{
x++;
y--;
}
}//-----end of for(i)---------------------
}//-----end of for(st_i)
//-----第二步:交换A和D的第二行起m个数字------
for (j=1; j<sizem+1; j++)
{
temp = a[(sizeh+1)/2-1][j];
a[(sizeh+1)/2-1][j] = a[(sizeh+1)/2+sizeh-1][j];
a[(sizeh+1)/2+sizeh-1][j] = temp;
}
//-----第三步:交换A和D其它行的数字-----------
for (i=0; i<sizeh; i++)
{
if (i == (sizeh + 1) / 2 - 1)
{
continue;
}
for (j=0; j<sizem; j++)
{
temp = a[i][j];
a[i][j] = a[sizeh+i][j];
a[sizeh+i][j] = temp;
}
}
//-----第四步:交换C和B最后m-1行的数字
for (i=0; i<sizeh; i++)
{
for (j=size-1; j>size-sizem; j--)
{
temp = a[i][j];
a[i][j] = a[sizeh+i][j];
a[sizeh+i][j] = temp;
}
}
}//-----end of if(size % 2 == 0)
//-----输出幻方-----------------------------------
cout<<endl;
for (i=0; i<size; i++)
{
for (j=0; j<size; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl<<endl;
}
cout<<endl;
//-----清除数组-------------------------------
for (i=0; i<size; i++)
{
delete [] a[i];
}
delete [] a;
}
求一个n阶魔方阵的算法用标准c语言的风格来做的,谢谢啦!!!我是才学才然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j<t或,xjAFGu
对平面魔方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)⑴ N 为奇数时,最简单
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
(3) 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
⑵ N为4的倍数时
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵
然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对
称交换,即a(i,j)与a(n+1-i,n+1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)
⑶ N 为其它偶数时
当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。
按上述奇数阶魔方给分解的4个子方阵对应赋值
上左子阵最小(i),下右子阵次小(i+v),下左子阵最大(i+3v),上右子阵次大(i+2v)
即4个子方阵对应元素相差v,其中v=n*n/4
四个子矩阵由小到大排列方式为 ① ③
④ ②
然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2),
a(t-1,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换
其中u=n/2,t=(n+2)/4 上述交换使每行每列与两对角线上元素之和相等。
snjsj 我的程序算法:
这个魔方阵的算法可以对除2以外的任意阶数的方阵进行输出,结果保存在运行程序的目录下面的Magic.txt文件中,用ie或者写字板打开以保持格式的一致(主要是回车符在记事本中为黑方框,认不出来)。当然具体的程序中,有内存空间以及变量范围的约束,我试过了,100以内的是可以的。
偶数阶的算法都是建立在奇数阶的基础之上,设方阵的阶数为n,则魔方阵常数(即每列每行以及对角线元素之和)为n*(n*n+1)/2。
请对照程序代码看,否则可能看不懂,可以一边看一边用笔对小阶的进行演算。
先说奇数阶的算法,这是最容易的算法:
n=2*m+1,m为自然数
1)将数字1填在(0,(n+1)/2) ;要注意c中是从下标0开始
2)从左上往右下依次填。
3)由2),列的下标出界(超过n-1)时,行加1,以n为摸的余数为应填的列数;
4)由2),行的下标出界(超过n-1)时,列加1,以n为摸的余数为应填的行数;
5)由2),行列都未出界,但已添上其他数,应在当前位置左横移一个位置进行填数。
然后是偶数阶:
分两种情况,一种是n%4==2,一种是n%4==0
前一种:n=2*(2*m+1),m为自然数
1)将n阶方阵分为四个小魔方阵ABCD如下排列:
B C
D A
因为n*n=4*(2*m+1)*(2*m+1),
记u=n/2=2*m+1,分为1~u*u,u*u+1~2*u*u,2*u*u+1~3*u*u,3*u*u+1~4*u*u
即在调用子函数的时候分别如下面传递参数:
A(0),B(u*u),C(2*u*u),D(3*u*u)
分别在ABCD中按照前面的填法把奇数阶填好(注意加上所传参数作为基数,每一个元素都要加上这个值),最后做如下交换:
(1)B中第0~(m-1)-1行中元素与C中相对应元素交换
(2)D中第(n-1)-m+1~(n-1)共m行的每行中的元素与A中相对应元素交换
(3)交换D:(u+m,m)与A中对应元素(矩阵中心值)
(4)交换D:(n-1,m)与A中对应元素(实际为矩阵最大值n*n)
所谓对应位置,指相对于小魔方阵的左顶角的相对的行列位置
上面的这些你可以用数学进行证明,利用魔方阵常数(注意n阶的和u阶的关系)
后一种:n=4*m,m为自然数
因为行列都是4的倍数,因而可以将整个矩阵分为每4*4的小矩阵。
先判断一个数是否在划为4*4小矩阵的对角线上,
如果在,则填该位置的数为n*n-i+1(i为该元素的相对位置,从1开始,比如n阶的第s行第t个元素则其i=s*n+t)
如果不在,则填上i。
三阶魔方阵
816
357
492
我把算法给你吧:
1,将1放在第一行中间一列
2,后面的数如此排列:每一个数放在上一个数的行数减一,列数加一的位置上(如5在4的右上格)
3,当上个数的行数为一,则下个数的行数为n(如1在第一行,2放到最后一行,列数依然加一)
4,当上个数列数为n,则下个数的列数为1(如2在第三行最后一列,3在第二行第一列,行数依然减一)
5,当上述规定位置上已经有数,或者上个数在第一行第n列,就要把下一个数放在上一个数的下面(如4在3下面,7在6下面)
根据这个算法,你应该会写出程序了!
#include <stdio.h>
#define NUM 5
void main()
{
int magic[NUM][NUM]={0};
int i,j,value;
i=0;
j=NUM/2;
magic[i][j]=1;
for(value=2;value<=NUM*NUM;value++)
{
if(magic[(i-1+NUM)%NUM][(j+1)%NUM]==0)
{
i=(i-1+NUM)%NUM;
j=(j+1)%NUM;
}
else
{
i=(i+1)%NUM;
}
magic[i][j]=value;
}
printf("\nThe magic(%d*%d)is:\n",NUM,NUM);
for(i=0;i<NUM;i++)
{
for(j=0;j<NUM;j++)
printf("%4d",magic[i][j]);
printf("\n");
}
}
有人会n阶魔方阵C#程序吗? 输入一个球N。一共N*N个数。排成N行N列...
} } \/\/初始化 row = n \/ 2; x = row - 1; hf = new int[n, n]; hf[row, colown] = 1; \/\/幻方 for (int i = 2; i <= n * n; i++, x = row - 1,
魔方阵的变形
在n阶魔方阵中,数字k的互补数=(1+n*n)–k原始魔方阵互补变形魔方阵14 16 03 01 03 01 14 16 04 02 15 13 13 15 02 04 09 11 06 08 08 06 11 09 07 05 10 12 10 12 07 05⒎田字变形法以中心点为准将魔方阵分成四个相等的小方阵。当n为奇数时,中央的行列要独立出来。n是...
c语言中魔方阵编程的思路
它的每一行、每一列和对角线之和均相等。输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。例如,当n=3时,魔方阵为:8 1 6 3 5 7 4 9 2 魔方阵中各数排列规律为:① 将“1”放在第一行的中间一列;② 从“2”开始直到n×n为止的各数依次按下列规则存放:每一个数...
如何用MATLAB解方阵的行列式?
(1)zeros()函数。zeros()函数能够生成元素全为0的矩阵。(2)ones() 函数。ones()函数能够生成元素全为1的矩阵。(3)rand()函数。rand()函数能够生成均匀分布随机矩阵。(4)randn()函数。randn()函数能够生成正态分布随机矩阵。(5)magic()函数。N阶方阵具有一个共同的奇妙特性...
C语言关于打印n阶魔方阵的编程有几个看不懂的,,求指点啊
幻方是可以构造的 分为奇数阶、双偶阶、偶数阶三种情况 具体可以参考百度百科 p==1表示true,为真也就是一直循环,直到p变成0 参考资料:http:\/\/baike.baidu.com\/view\/5058.htm
数组的应用举例——魔方阵:它要求在一个n×n的矩阵中填入1到n2的数字...
8求一个8×8矩阵对角线元素之和。 main() {int i=1,j=1,a[8][8],s8,s8; for(i=1;i<8;i++) for(j=1;j<8... 例如,三阶魔方阵为 8 8 8 8 8 8 8 9 8 要求打印出由8~n8的自然数构成的魔方阵...>>8个相似问题 ...
算法设计与分析:3阶魔方阵
(4)若应填的位置虽然没有出界,但是已经填有数据的话,则应填在上一个数的下面(行加1,列不变),即取i1=i+1,j1=j。这样循环填数,直到把n*n个数全部填入方阵中,最后得到的是一个n阶魔方阵。main( ){int i,j, i1,j1,x,n,t,a[100][100];print(“input an odd number:”...
魔方阵奇数阶魔方阵的建构法(又称奇数幻方)
将它们的对应方格数值相加,形成新的魔方阵。扩阶法用于构建n阶魔方阵(n>5),首先构建n-2阶魔方阵,然后将每个数字加2n-2,最后填充外部空格形成新的矩阵。方阵合成法适用于n阶魔方阵,当n可分解为两个大于2的整数p和q的乘积,通过矩阵A和B的操作,可以生成一个m*n阶的魔方阵。
算法设计与分析:3阶魔方阵
1、累加和=所有数字和\/行数=(1+n2)*n2\/2n=n(n2+1)\/2 2、这叫幻方 3、奇数阶幻方有构造方法:从1开始,往右斜上顺次填写。特殊情况:如果数字出了幻方,将该数填至行或列的另一端。特殊情况2: 如果要填写的格子被占了,数填在格子下方一格。特殊情况3: 我忘了。
偶数阶魔方阵是什么意思
偶数阶魔方阵是数学中的一个重要概念,也是一种矩阵排列形式,由$n^2$个数字排列成$n\\\\times n$的矩阵,并且在每一行、每一列和对角线上的数字之和都相等。其中,偶数阶魔方阵的边长为偶数。偶数阶魔方阵有着独特的排列方式和特殊的性质,因此在数学、物理、工程等领域有着广泛的应用。特别是在...
愈览吡拉: 对平面魔方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式) ⑴ N 为奇数时,最简单 (1) 将1放在第一行中间一列; (2) 从2开始直到n*n止各数依次按下列规则存放: 按 45°方向行走,如向右上 每一个数存放的行...
玉林市13027661890: n阶魔方阵C语言 - ?
愈览吡拉: /*15 阶内奇数魔方阵C程序*/#include<stdio.h> main() { int a[16][16],i,j,m,n; printf("\n请输入阶数"); IN: scanf("%d",&n); if (n>15 ) goto IN ; if(0==n%2) n++; for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=0; i=1; j=n/2 +1; a[i][j]=1; for(m=2;m<=n*n;m++) { ...
玉林市13027661890: 用c语言编写n阶魔方阵.谢谢了!!! - ?
愈览吡拉: 下面这个程序原本是从百度百科里找到的,不过发现百科里面那个程序原来有误,修改后终于可以了,给你,希望有帮助!!!#include <stdio.h> #define N 16 //N可修改int main() { int a[N][N]={0},i,j,k,p,m,n; p=1; while(p==1) { printf("Enter n(1...
玉林市13027661890: c语言中的n阶方阵怎嘛做 - ?
愈览吡拉: C语言中int型的数值非常的小,最大的范围也只在[-2^31 , 2^31 -1],所以使用int类型最大只能表示13的阶乘而已,使用范围更大的double才是王道./* Note:Your choice is C IDE */#include "stdio.h" void main() { int i,n,flg; double num=1; printf("...
玉林市13027661890: 求助C语言高手,关于魔方矩阵的问题把整数1到n2排成一个n*n方阵, 使方阵中的每一行, 每一列以及对角线上的数之和都相同.①n阶魔方阵的产生;生成... - ?
愈览吡拉:[答案] #include #define N 15 void main() { int iArr[N][N] = {0}; /*魔法阵数组*/ /*定义变量,i,j为循环控制变,iNum表示数组的行数... if (iPox == 0) /*如果上一个数的行数为第一行,则下一个数的行数为最下一行,列数同样加1;*/ { if (iPoy != iNum-1) /*上一个数...
玉林市13027661890: C语言N阶幻方的思路,求高手指教… - ?
愈览吡拉: 求一个n阶魔方阵的算法用标准c语言的风格来做的,谢谢啦!!!我是才学才然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(j
玉林市13027661890: 用c语言写一个输出魔方阵的程序. - ?
愈览吡拉: #include #define N 15 void main() {a:;int a[N][N],t;int i,j,m,n,c,b,k=1;printf("输入魔方阵阶数(不超过%d):",N);scanf("%d",&t);if(t<2||t>17){printf("输入不合法,请重新输入!\n\n");goto a;}if(t%2==0){printf("偶...
玉林市13027661890: 用C语言编写一个程序 输出魔方阵 - ?
愈览吡拉: #include #define n 16 //这里可以修改n的值 int main() { int a[n][n],i,j,k,p,m,n; p=1; while(p==1) /*要求阶数为1~15的商数*/ { printf("enter n(n=1~15):"); //可以输入小于等于n-1的整数 scanf("%d",&n); if((n!=0)&&(n<=n-1)&&(n%2!=0)) p=0; } for...
玉林市13027661890: 用c语言求一个n阶方阵的所有元素之和,并给出算法的时间复杂度?
愈览吡拉: #include <stdio.h> #include <stdlib.h> #define N 3 int main(void) { int a[N][N] = {1,2,3,4,5,6,8,7,9}; int iterx = 0, itery = 0; int sum = 0; for(iterx = 0; iterx < N; iterx++) { for(itery = 0; itery < N; itery++) { sum += a[iterx][itery]; } } printf("the sum ...
玉林市13027661890: 用C语言实现输出魔方阵的算法 - ?
愈览吡拉: 这个只能实现奇价的: 算法: 魔方阵的排列规律(奇数阵): ⑴将1放在第一行中间一列. ⑵从2开始直到n*n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1. ⑶如果上一个数的行数为1,则下一个数的行数为...