n阶魔方的构成方法C语言,穷举法打印n阶魔方矩阵

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

//   穷举法打印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 ;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值