n阶魔方

n阶魔方

题目

n阶魔方 :将1~n^2个数填写到一个由n行n列的方阵中,使得每一行每一列及两个对角线上的数字之和分别等于同一个数。称这个方阵为一个n阶魔方

示例

当n=3时, 每行之和为15,如图

6 1 8
7 5 3
2 9 4

分析

第一步:元素的位置记为(i,j),第一个元素为(0,n/2)
第二步:下一个元素(i1,j1)为(i,j)的左上角位置处,及(i1=i-1,j1 = j-1); 对于这个位置有两种情况:

  1. 若(i1,j1)有数字,则修改i1与j1的值i1=i+2,j1=j+1
  2. 若i1<0&&j1>=0时,修改i1=n-1;
    若j1<0&&i1>=0.修改j1=n-1

代码

void MAGIC(int A[][MaxZise],int n){    
	int i,j,num;    
	// 初始化,默认为0    
	for ( i = 0; i < n; i++)         
		for ( j = 0; j < n; j++)             
			A[i][j]=0;           
	i=0;    
	j=n/2;  // i与j的初始位置    
	for ( num = 0; num < n*n; num++)    {        
		if (i<0&&j<0||A[i][j]!=0)        {            
			i+=2;           
			 j++;        
		}        
		A[i--][j--]=num;        
		if (i<0&&j>=0)        {            
			i=n-1;  // 修改i的位置        
		}        
		if (j<0&&i>=0)        {           
			 j=n-1;  // 修改J的位置        
		}   
	 }// for
}

显然 时间复杂度为O(n^2).

猜你喜欢

转载自blog.csdn.net/honeylife/article/details/99584241
今日推荐