⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 利用数学规律求魔方.cpp

📁 用来求解任意阶幻方问题,对单偶幻方和双偶幻方都进行了求解.
💻 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 + -