24点游戏算法

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <math.h>  
  4.   
  5. #define LING    1E-6  
  6. #define CONT    4  
  7. #define VOLUE   24  
  8.   
  9. float number[CONT];       
  10. char expression[CONT][20] ;               
  11. bool m_judge = false;                           //判断是否有解。  
  12. int count = 0;  
  13.   
  14. void Find(int n)  
  15. {  
  16.     int i = 0, j = 0;  
  17.   
  18.     if (n == 1)  
  19.     {  
  20.         if ( fabs(number[0] - 24) <= LING)  
  21.         {  
  22.             for (i = 0; i < 20; i++)   
  23.             {  
  24.                 printf("%c", expression[0][i]) ;  
  25.             }  
  26.             printf("\t\t") ;  
  27.             m_judge = true;  
  28.             count ++;  
  29.             if((count % 2)==0)              //使输出时每行三个表达式  
  30.                 printf("\n") ;  
  31.         }  
  32.         else  
  33.         { }  
  34.     }  
  35.     for(i = 0; i < n; i++)               //查找  
  36.     {  
  37.         for (j = i + 1; j < n; j++)      //与其后面的查找进行计算  
  38.         {  
  39.             float a, b;   
  40.             char expressiona[20], expressionb[20];  
  41.                   
  42.             a = number[i] ;  
  43.             b = number[j] ;  
  44.             number[j] = number[n - 1];  
  45.   
  46.             strcpy(expressiona, expression[i]) ;  
  47.             strcpy(expressionb, expression[j]) ;  
  48.             strcpy(expression[j], expression[n - 1]) ;  
  49.               
  50.             sprintf(expression[i], "(%s+%s)", expressiona, expressionb) ;  
  51.             number[i] = a + b;  
  52.             Find(n-1);  
  53.           
  54.             ///////////////////////////////////   
  55.             sprintf(expression[i], "(%s-%s)", expressiona, expressionb) ;  
  56.             number[i] = a - b;  
  57.             Find(n-1);  
  58.               
  59.             sprintf(expression[i], "(%s-%s)", expressionb, expressiona) ;  
  60.             number[i] = b - a;  
  61.             Find(n-1);  
  62.               
  63.             sprintf(expression[i], "(%s*%s)", expressiona, expressionb) ;  
  64.             number[i] = a * b;  
  65.             Find(n-1);  
  66.               
  67.             if (b != 0)  
  68.             {  
  69.                 sprintf(expression[i], "(%s/%s)", expressiona, expressionb) ;  
  70.                 number[i] = a / b;  
  71.                 Find(n-1);  
  72.             }  
  73.             if (a != 0)  
  74.             {  
  75.                 sprintf(expression[i], "(%s/%s)", expressionb, expressiona) ;  
  76.                 number[i] = b / a;  
  77.                 Find(n-1);  
  78.             }  
  79.             number[i] = a;                          // 最后一层的Find(2)调用完成后将a重新赋值给number[i]即number[0]  
  80.             number[j] = b;                          // 最后一层的Find(2)调用完成后将b重新赋值给nubmer[j]即number[1]  
  81.             strcpy(expression[i], expressiona) ;  
  82.             strcpy(expression[j], expressionb) ;  
  83.         }  
  84.     }  
  85. }  
  86. int main()  
  87. {  
  88.     int i, j ;  
  89.     printf("请输入四个数:\n") ;  
  90.     for (i = 0; i < CONT; i++)  
  91.     {  
  92.         char ch[20], s;  
  93.         int a ;  
  94.         printf("第%d个数:", i+1) ;  
  95.         scanf("%f", &number[i]) ;  
  96.         a = (int)number[i] ;  
  97.         s = char(a + 48);  
  98.         ch[0] = s ;  
  99.         for (j = 1; j < 20; j++)   
  100.         {  
  101.             ch[j] = 0 ;  
  102.         }  
  103.         strcpy(expression[i], ch) ;  
  104.     }  
  105.       
  106.     printf("\n") ;  
  107.     Find(CONT) ;  
  108.     if(m_judge==true)  
  109.     {  
  110.         printf("\n\n成功!\n") ;  
  111.         printf("总共的计算方法共有:%d\n", count) ;  
  112.     }  
  113.     else  
  114.     {  
  115.         printf("失败!") ;  
  116.     }  
  117.     return 0;  
  118. }

猜你喜欢

转载自blog.csdn.net/fangyan5218/article/details/46447197
今日推荐