编程解魔方
A. 请大家帮我讲解一下数学中魔方阵的规律.并用编程解一下.
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数肢租薯的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个型备数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,历者所以4就放在3的下面;
#include<stdio.h>
int main()
{int a[15][15],i,j,k,p,n;
p=1;
while(p==1)
{printf("enter n(n=1--15);");
scanf("%d",&n);
if((n!=0)&&(n<15)&&(n%2!=0))
p=0;
}
for(i=1;i<n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[i][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("%5d",a[i][j]);
printf("\n");
}
return 0;
}
B. 如何用c语言编程使三阶幻方不等
这个打印n阶的 0<n<=15是奇数 我在下面帮你改了个3阶的
/* bookp33.c 打印魔方阵程序 */
/* 谭浩强,C程序设计题解与上机指导,33页 */
/* 在tc30下编译通过 */
/* 2001.12.12 */
void main()
{
int a[16][16],i,j,k,p,m,n;
p=1;
while(p==1)
{ printf("请输入n.(0<n<=15,n是奇数.)\n");
scanf("%d",&n);
if((n>=0)&&(n<=15)&&(n%2!=0))
{ printf("矩阵阶数是:%d\n",n);
p=0;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
/* 建立魔方阵 */
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(" %3d",a[i][j]);
printf("\n");
}
}
*************3阶的************
int main()
{
int a[16][16],i,j,k,n;
n=3;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
/* 建立魔方阵 */
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(" %3d",a[i][j]);
printf("\n");
}
return (1);
}
C. 求魔方的算法 我指的是计算机编程算法 最好有C++ 或C#的源代码
具体做法:
方法一;
/*此程序使我按照上面介绍的魔方阵的规律编写的,不过只能求奇数魔方阵,经过测试可以算到508阶*/
#define N 7
#include<stdio.h>
void main()
{
int a[N][N],i,j,k;
for(i=0;i<N;i++) /*先处理第一行*/
for(j=0;j<N;j++)
{
a[i][j]=0; /*先令所有元素都为0*/
}
j=(N-1)/2; /*判断j的位置*/
a[0][j]=1; /*将1放在第一行中间一列*/
for(k=2;k<=N*N;k++) /*再从2开始处理*/
{
i=i-1; /*存放的行比前一个数的行数减1*/
j=j+1; /*存放的列比前一个数的列数加1*/
if((i<0)&&(j==N)) /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/
{
i=i+2;
j=j-1;
}
else
{
if(i<0) /*当行数减到第一行,返回到最后一行*/
i=N-1;
if(j>N-1) /*当列数加到最后一行,返回到第一行*/
j=0;
}
if(a[i][j]==0) /*如果该元素为0,继续执行程序*/
a[i][j]=k;
else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=0;i<N;i++) /*输出数组*/
{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}
方法二:
/*这个是网友qfyzy为帮助我找错而提供的,可以算到99阶*/
#define N 7
#include<stdio.h>
void main()
{
int a[N][N]={0},i=0,j,k; /*先令所有元素都为0*/
j=(N-1)/2;
i=0;
for(k=1;k<=N*N;) /*开始处理*/
{
if((i<0)&&(j==N)) /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/
{
i=i+2;
j=j-1;
}
else if(i<0) /*当行数减到第一行,返回到最后一行*/
i=N-1;
else if(j>N-1) /*当列数加到最后一行,返回到第一行*/
j=0;
else if(!a[i][j]){ /*如果该元素为0,继续执行程序*/
a[i][j]=k++;
i=i-1;
j=j+1;
}
else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
{
i=i+2;
j=j-1;
}
}
for(i=0;i<N;i++) /*输出数组*/
{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}