#include <stdio.h>
#include <dos.h>
#define N 4
#define M 5
#define MAX 10
int recursion_n( int n, int m );
int recursion_m( int m);
int is_eq( int m );
void init_env( void );
void list_s( void );
//int get_num( );
void set_num( int i , int f );
char s[N][M] = { 'A', 'B', 'C', 'D', 'E',
0, 0, 'D', 'F', 'G',
0, 0, 'D', 'F', 'G',
'X', 'Y', 'Z', 'D', 'E' }; // 存放等式
int val[128]; // 存放值
int sn[MAX]; // 存放已经使用过的数值
void main( void )
{
int add=0;
init_env( );
recursion_m( M-1);
}
void init_env( void )
{
int x;
for( x = 0; x < 128; x++ )
val[x] = -1;
for( x = 0; x < MAX ; x++ )
sn[x] = -1;
}
void list_s( void )
{
int x, y;
for( x=0; x<N; x++ ){
for( y=0; y<M; y++ ){
printf( "%d", val[ s[x][y] ]);
}
printf("\n" );
}
}
// 置可用标志
void set_num( int i , int f )
{
sn[i] = f;
}
// 判断是否相等
int is_eq( int m )
{
int x, sum=0, p=0, q=0,add,i,t=0;
for( x =0; x< N -1; x++ )
sum += val[ s[x][m] ];
if(m>3) // 取进位值
{
add=t;
}
if(m<4){
for(i=0;i<N-1;i++)
t+=val[s[i][m+1]];
add=t/MAX;;
}
sum += add;
q = sum % MAX; // 取余
if((sn[ q ] == -1)&&(val[ s[x][m] ] == -1)&& (val[s[0][m]]!=q)&&(s[0][m]!=s[x][m])) {
val[ s[x][m] ] = q;
set_num( q, 1 );
return( 0 );
}
if(( q == val[ s[0][m] ] )&&(val[s[x][m]]!=-1)&&(sn[q]!=-1)&&(s[0][m]==s[x][m]) ) { // 相等
val[s[x][m]]=q;
set_num(q,1);
return(0);
}
return( -1 );
}
// 递归N
int recursion_n( int n, int m )
{
int x;
// 判断是否已经结束了
if( n >= N -1 ){ // 判断等式是否相等
if( !is_eq( m ) ) {
recursion_m( m-1);
}
return( 0 );
}
if(val[s[n][m]]==-1){
if(s[n][m]==0){
val[s[n][m]]=0;
val[s[n+1][m]]=0;
recursion_n( n+2, m );
}
else
{
for( x=0; x < MAX; x++ ){
if(sn[x]==-1){ // 如果没有数,则置数
val[ s[n][m] ] = x ;
val[s[n+1][m]]=x;
set_num( x, 1 ); // 置已用标
recursion_n( n+2, m );
set_num( x, -1 ); // 置未用标志 //置未用标志,继续循环
val[ s[n][m] ] = -1;
}
}
}
}
else
{
val[s[n+1][m]]=val[s[n][m]];
recursion_n( n+2, m );
}
return(0);
}
// 递归M
int recursion_m( int m )
{
int x, n=0; // 判断是否已经结束了
if( m < 0 )
{
list_s( );
return( 0 );
}
for( x=0; x < MAX; x++ ) // 如果没有数,则置数
{
if((sn[x]==-1)&&(val[s[n][m]]==-1))
{
val[ s[n][m] ] = x ;
set_num( x, 1 ); // 置已用标志
recursion_n( n+1, m );
val[ s[n][m] ] = -1; //置未用标志,继续循环
set_num( x, -1 ); // 置未用标志
}
}
return(0);
}
-----------------------------------------------------------------------------------------------------------------------
不知道会不会溢出!!!!!!!