#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);
}
-----------------------------------------------------------------------------------------------------------------------
不知道会不会溢出!!!!!!!

 
											





 
	     
											 
										
					
	

