魔方编程方法
❶ C语言编程,输出魔方阵
源代码如下:
#include<stdio.h>
#define N 5
int main()
{
int a[N][N]={0}, i, j, k, t, x, y;
i=0; /*自然数1的行标*/
j=N/2; /*自然数1的列标*/
t=N-1; /*最后一行、最后一列的下标*/
for(k=1; k<=N*N; k++)
{
a[i][j]=k;
x=i;
y=j;
if(i == 0)
i=t;
else
i=i-1;
if(j != t)
j=j+1;
else
j=0;
if(a[i][j]!=0)
{
i=x+1;
j=y;
}
}
printf("生成的5-魔方阵为:");
for(i=0; i<N; i++)
{
printf(" ");
for(j=0; j<N; j++)
{
printf("%3d", a[i][j]);
}
}
printf(" ");
return 0;
}
(1)魔方编程方法扩展阅读
1、由于一个整型数要占用两个内存,因此,如果魔方阵中要存放的数有max个,则分配内存时要分配2*max个单元,从而有malloc(max+max)。在malloc()函数中使用max+max而不是2*max是考虑了程序运行的性能。
2、内存是一维线性的,因此在存取数组元素时,要将双下标转换为单个索引编号。在程序中直接定义了指针变量来指向数组空间,即使用malloc()函数分配的内存。
❷ c语言中魔方阵编程的思路
/*
所谓魔方阵是指这样的的方阵:
它的每一行、每一列和对角线之和均相等。
输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。
例如,当n=3时,魔方阵为:
8 1 6
3 5 7
4 9 2
魔方阵中各数排列规律为:
① 将“1”放在第一行的中间一列;
② 从“2”开始直到n×n为止的各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数同样加1;
③ 如果上一数的行数为1,则下一个数的行数为n(最下一行),如在3×3 方阵中,1在第1行,则2应放在第3行第3列。
④ 当上一个数的列数为n时,下一个数的列数应为1,行数减1。如2在第3行第3列,3应在第2行第1列。
⑤如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
如按上面的规定,4应放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
*/
#include"stdio.h"
void main()
{
int i,n=5;
printf("---------------打印魔方阵-------------\n\n");
int a[5][5];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=0;//初始化
i=0;
int j=n/2;
int t=1;
int si=0;
int sj=0;//记录上一个数的位置
while(t<=n*n)
{
//printf("\n%4d\n\n",t);
if(a[i][j]==0)
a[i][j]=t;
else
{
if(si==0 && sj==n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si!=n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si==n-1)
{
a[0][sj]=t;
i=0;
j=sj;
}
}
si=i;
sj=j;
/*计算下一个元素的位置*/
if(i==0)
i=n-1;
else
i=i-1;
if(j==n-1)
j=0;
else
j=j+1;
t=t+1;
}
for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n\n");
}
}
❸ 怎样通过编程实现魔方复原
即使最强大的计算机也无法通过编程好复原,因为计算量太大了。
三阶魔方有43,252,003,274,489,856,000种组合样式,再强大的计算机也无法计算出最佳恢复路线,如果可以,那么所有情况都能用20步复原,只会少不会多。
❹ 用C语言如何编程打印出由1到n^2的自然数构成的魔方阵,
奇数魔方阵就是将数字排列在nxn(n为奇数)的方阵上,要求满足各行、各列与各对角线的和相同。如下图所示,是n=5的奇数魔方阵。
一般程序语言的阵列多由0开始,为了计算方便,我们利用索引1到n的部份,而在计算是向右(左)上或向下时,我们可以将索引值除以n值,如果得到余数为1就向下,否则就往右(左)上。