该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
// 穷举法打印n阶魔方矩阵 n <= 10
#include
#include
int A[ 11 ][ 11 ];
bool Flag[ 101 ]; //若K已被使用则Flag[k]=true,否则为false
int n = 3 ,Count = 0 ,Point = 0 , Avr = 0 ;
int i_g = 1 , j_g = 1 , k_g = 1 ;
bool i_change = false ;
bool j_loop = false , k_loop = false ;
/funtion init( )
void init( ) // 对变量初始化
{
for ( int i = 1; i <= n; i ++ )
for ( int j = 1; j <= n; j ++ )
{
A[ i ][ j ] = 0;
Flag[ j + ( i - 1 ) * n ] = false;
}
Count = n * n; // 矩阵的变量数
Point = n / 2 ; // 设置判断点
for ( i = 1 ; i <= Count ; i ++ )
Avr += i ;
Avr /= n ; // 矩阵每行每列之和必须 = Avr
}
funtion Sum( )
int Sum ( int j , bool row )
{
int total = 0 ;
if ( row == true ) // 返回 j个数的最大之和(末被使用的)
for ( int k = Count ; j ; k -- )
{
if ( ! Flag[ k ] )
{
total += k ;
j -- ;
}
}
else if ( row == false ) // 返回 j个数的最小之和......
for ( int k = 1 ; j ; k ++ )
{
if ( ! Flag[ k ] )
{
total += k ;
j -- ;
}
}
return Avr - total;
}
/function Test( )
bool Test ( int i, int j ) //测试A[i][j]是否可行,可行返回true,否则false
{
int temp ;
if ( j > Point )
{
temp = 0 ;
for ( int k = j ; k >= 1 ; k -- )
temp += A[ i ][ k ] ; //计算第i行元素之和(被使用的)
if ( j == n && temp != Avr )
return false ;
else if (j != n && ( temp Sum ( n - j , false ) ) )
return false;
}
if ( i > Point )
{
temp = 0 ;
for ( int k = i ; k >= 1 ; k -- )
temp += A[ k ][ j ] ; // 计算第j列元素之和(被使用的)
if ( i == n && temp != Avr )
return false ;
else if ( i != n && ( temp Sum ( n - i , false ) ) )
return false;
}
temp = 0 ;
if ( i == n && j == 1 ) // A[i][j]为左下角的元素
{
for ( int a = i , b = j ; a >= 1 ; a -- , b ++ )
temp += A[ a ][ b ] ; // 计算左斜线的元素之和(已全部使用)
if ( temp == Avr )
return true ;
else
return false ;
}
if ( i == n && j == n ) // A[i][j]为右下角的元素
{
for ( int a = i , b = j ; a >= 1 ; a -- , b -- )
temp += A[ a ][ b ] ; // 计算右斜线的元素之和(已全部使用)
if ( temp == Avr )
return true ;
else
return false ;
}
temp = 0 ;
if ( i == j )
{
for ( int a = i , b = j ; a >= 1 ; a -- , b -- )
temp += A[ a ][ b ] ; // 计算右斜线的元素之和(被使用的)
if ( temp Sum ( n - i , false ) )
return false;
}
temp = 0 ;
if ( i + j == n + 1 )
{
for ( int a = i , b = j ; a >= 1 ; a -- , b ++ )
temp += A[ a ][ b ] ; // 计算右斜线的元素之和(被使用的)
if ( temp Sum ( j - 1 , false ) )
return false;
else
return true ;
}
return true ;
}
/function back()
bool back ( ) // 进行回溯
{
if ( j_g == 1 )
{
j_loop = false ;
Flag[ A[ i_g - 1 ][ n - 1 ] ] = false ;
Flag[ A[ i_g - 1 ][ n ] ] = false ;