📄 利用数学规律求魔方.cpp
字号:
//利用数学规律求解幻方问题
# include<stdio.h>
int a[100][100],b[100][100]={0},N;
void Init(int n) //初始化幻方数组
{
int i,j,k=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
a[i][j]=k++;
}
}
void Magic1(int i,int j,int n) //处理双偶阶魔方问题
{
int i2,j2,i1,j1,b[5][5];
i2=1;j2=1;
for(i1=i;i1<i+4;i1++) //借处B来处理A数组
{
for(j1=j;j1<j+4;j1++)
{
b[i2][j2]=a[i1][j1];
if(j2==4)
{
i2++;
j2=1;
}
else
j2++;
}
}
for(i1=1;i1<=4;i1++) //处理最小情况
{
for(j1=1;j1<=4;j1++)
{
if(i1==j1||i1+j1==5)
b[i1][j1]=N+1-b[i1][j1];
}
}
i2=i;j2=j;
for(i1=1;i1<=4;i1++)
{
for(j1=1;j1<=4;j1++)
{
a[i2][j2]=b[i1][j1];
if(j2==j+3)
{
i2++;
j2=j;
}
else
j2++;
}
}
}
void huafen(int i,int j,int n) //对一个大的幻方进行分划
{
int i1,j1,k,m;
Init(n);
N=a[n][n];
k=n/4;
i1=i;j1=j;
for(m=1;m<=k*k;m++)
{
Magic1(i1,j1,4);
if(j1==n-3)
{
j1=i;
i1=i1+4;
}
else
j1=j1+4;
}
}
void Magic2(int n) //处理单偶幻方
{
int i,j,i1,j1,k,t;
huafen(1,1,n-2);
N=n*n;
k=n/4;
i1=1;j1=1;
for(i=2;i<=n-1;i++) //填单偶幻方的中间一块
{
for(j=2;j<=n-1;j++)
{
b[i][j]=a[i1][j1]+8*k+2;
if(j1==n-2)
{
j1=1;
i1++;
}
else
j1++;
}
}
//对固定的十个位置进行赋值
b[1][1]=1; b[n][1]=4; b[n-1][1]=10; b[2][n]=3; b[3][n]=5;
b[4][n]=7; b[n][n-2]=2; b[n][n-1]=9; b[1][2]=6; b[1][3]=8;
//按公式对外围进行赋值
t=11; for(j=4;j<=k+2;j++) b[1][j]=t++;
t=k+10; for(i=5;i<=k+3;i++) b[i][n]=t++;
t=2*k+9; for(j=2*k+2;j<=3*k;j++) b[n][j]=t++;
t=3*k+8; for(i=2*k+3;i<=4*k;i++) b[i][1]=t++;
t=5*k+6; for(j=3*k+1;j<=4*k-1;j++) b[n][j]=t++;
t=6*k+5; for(i=k+4; i<=2*k+2;i++) b[i][n]=t++;
t=7*k+4; for(j=k+3;j<=2*k+1;j++) b[1][j]=t++;
//处理未填的空格
N=n*n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(b[i][j]==0)
{
if(i==j||i+j==n+1)
b[i][j]=N-b[j][i]+1;
else
{
if(i==1||i==n)
b[i][j]=N+1-b[n-i+1][j];
else
b[i][j]=N+1-b[i][n-j+1];
}
}
}
}
}
void main() //利用数学规律求解魔方
{
int n,i,j;
printf("请输入魔方的阶数n!=2:\n");
scanf("%d",&n);
//Init(n);
//N=a[n][n];
if(n%2!=0) //求解奇数阶魔方
{
int i,j,k=1,a[100][100]={0},newi,newj;
i=1;
j=n/2+1;
a[i][j]=k;
do
{
if(i==1) newi=n; else newi=i-1;
if(j==n) newj=1; else newj=j+1;
if(a[newi][newj]==0)
{
a[newi][newj]=++k;
i=newi;
j=newj;
}
else
{
a[i+1][j]=++k;
i=i+1;
}
}while(k<n*n);
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
else if(n%4==0) //处理双偶魔方
{
huafen(1,1,n);
for(i=1;i<=n;i++)
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
printf("\n");
}
else //求单偶魔方
{
Magic2(n);
b[n][n]=n*n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",b[i][j]);
printf("\n");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -