Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.51 KB | None | 0 0
  1. /* File: 24solver.cpp */
  2. /* Name/NIM: Nathaniel Evan Gunawan/13516055 */
  3. /* Brute force strategy:
  4. Have user input 4 numbers: a, b, c, d
  5. Mode 1: ((a _ b) _ c) _ d, or
  6. Mode 2: (a _ b) _ (c _ d)
  7. Check if the final result is 24 */
  8. /* Remember to take into account the order of the operands...
  9. ... and the arithmetic operators used throughout the calculation! */
  10.  
  11. #include <iostream>
  12. #include <vector>
  13. #include <string>
  14. using namespace std;
  15.  
  16. typedef struct MathExpr *ExprPtr;
  17. typedef struct MathExpr {
  18.     ExprPtr oprd1; // operand 1
  19.     ExprPtr oprd2; // operand 2
  20.     int opr; // operator (1-8, see comment in PerformOpr)
  21.     float result;
  22. } Expr;
  23.  
  24. Expr ArrayExpr[7]; //index 0-3 contains the 4 user-inputted numbers
  25. // while index 4-6 contains the calculation steps
  26.  
  27. string strexpr;
  28.  
  29. vector <string> Solutions;
  30.  
  31. void PerformOpr (int x, int ArrayIdx, int Oprd1Idx, int Oprd2Idx)
  32. {
  33.     /* 8 possible operations:
  34.     Opr 1: num1 + num2
  35.     Opr 2: num1 - num2
  36.     Opr 3: num1 * num2
  37.     Opr 4: num1 / num2
  38.     Opr 5: num2 + num1
  39.     Opr 6: num2 - num1
  40.     Opr 7: num2 * num1
  41.     Opr 8: num2 / num1 */
  42.     if (x == 1) {
  43.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  44.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  45.         ArrayExpr[ArrayIdx].opr = 1;
  46.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result + ArrayExpr[ArrayIdx].oprd2->result;
  47.     }
  48.     else if (x == 2) {
  49.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  50.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  51.         ArrayExpr[ArrayIdx].opr = 2;
  52.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result - ArrayExpr[ArrayIdx].oprd2->result;
  53.     }
  54.     else if (x == 3) {
  55.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  56.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  57.         ArrayExpr[ArrayIdx].opr = 3;
  58.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result * ArrayExpr[ArrayIdx].oprd2->result;
  59.     }
  60.     else if (x == 4) {
  61.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  62.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  63.         ArrayExpr[ArrayIdx].opr = 4;
  64.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result / ArrayExpr[ArrayIdx].oprd2->result;
  65.     }
  66.     else if (x == 5) {
  67.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd2Idx];
  68.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd1Idx];
  69.         ArrayExpr[ArrayIdx].opr = 1;
  70.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result + ArrayExpr[ArrayIdx].oprd2->result;
  71.     }
  72.     else if (x == 6) {
  73.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd2Idx];
  74.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd1Idx];
  75.         ArrayExpr[ArrayIdx].opr = 2;
  76.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result - ArrayExpr[ArrayIdx].oprd2->result;
  77.     }
  78.     else if (x == 7) {
  79.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd2Idx];
  80.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd1Idx];
  81.         ArrayExpr[ArrayIdx].opr = 3;
  82.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result * ArrayExpr[ArrayIdx].oprd2->result;
  83.     }
  84.     else if (x == 8) {
  85.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd2Idx];
  86.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd1Idx];
  87.         ArrayExpr[ArrayIdx].opr = 4;
  88.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result / ArrayExpr[ArrayIdx].oprd2->result;
  89.     }
  90. }
  91.  
  92. void MakeExpr (Expr a, int itrtion)
  93. // Constructs a syntactically valid mathematical expression based
  94. // itrtion = iteration. Its use here is to eliminate the outermost brackets
  95. // i.e. (20 - ((1 + 15) - 10)) --> 20 - ((1 + 15) - 10)
  96. {  
  97.     int temp;
  98.    
  99.     if (a.oprd1 == NULL) {
  100.         temp = (int) a.result;
  101.         strexpr.append(to_string(temp));
  102.     }
  103.     else {
  104.         if (itrtion > 0) {
  105.             strexpr.append("(");
  106.         }
  107.         MakeExpr(*a.oprd1, itrtion + 1);
  108.         if (a.opr == 1) {
  109.             strexpr.append("+");
  110.         }
  111.         else if (a.opr == 2) {
  112.             strexpr.append("-");
  113.         }
  114.         else if (a.opr == 3) {
  115.             strexpr.append("*");
  116.         }
  117.         else if (a.opr == 4) {
  118.             strexpr.append("/");
  119.         }
  120.         MakeExpr(*a.oprd2, itrtion + 1);
  121.         if (itrtion > 0) {
  122.             strexpr.append(")");
  123.         }
  124.     }
  125. }
  126.  
  127. void SubmitExpr ()
  128. /* Checks if a solution already exists.
  129. Yes: the solution will be discarded.
  130. No: the solution will be included in the vector of solutions, and displayed. */
  131. {
  132.     bool SolutionFound = false;
  133.     int NumSolutions = Solutions.size();
  134.     if (NumSolutions > 0) {
  135.         int x = 0;
  136.         while ((!SolutionFound) && (x < NumSolutions)) {
  137.             if (Solutions[x] == strexpr) {
  138.                 SolutionFound = true;
  139.             }
  140.             else {
  141.                 x++;
  142.             }
  143.         }
  144.     }
  145.     if (!SolutionFound) {
  146.         Solutions.push_back(strexpr);
  147.         cout << Solutions.size() << ". ";
  148.         cout << Solutions[NumSolutions] << endl;
  149.     }
  150.     strexpr.clear();
  151. }
  152.  
  153. int main()
  154. {
  155.     int idx1, idx2, idx3, idx4, opr1, opr2, opr3;
  156.    
  157.     printf("Welcome to 24 Game Solver!\n");
  158.     printf("Enter your 4 numbers below:\n");
  159.     for (int x = 0; x <= 3; x++) {
  160.         cin >> ArrayExpr[x].result;
  161.         ArrayExpr[x].oprd1 = NULL;
  162.         ArrayExpr[x].oprd2 = NULL;
  163.         ArrayExpr[x].opr = 0; // initializing values
  164.     }
  165.     // Mode 1 below
  166.     for (idx1 = 0; idx1 <= 3; idx1++) {
  167.         for (idx2 = 0; idx2 <= 3; idx2++) {
  168.             if (idx2 != idx1) {
  169.                 for (opr1 = 1; opr1 <= 8; opr1++) {
  170.                     PerformOpr(opr1, 4, idx1, idx2);
  171.                     for (idx3 = 0; idx3 <= 3; idx3++) {
  172.                         if ((idx3 != idx1) && (idx3 != idx2)) {
  173.                             for (opr2 = 1; opr2 <= 8; opr2++) {
  174.                                 PerformOpr(opr2, 5, 4, idx3);
  175.                                 for (idx4 = 0; idx4 <= 3; idx4++) {
  176.                                     if (((idx4 != idx1) && (idx4 != idx2)) && (idx4 != idx3)) {
  177.                                         for (opr3 = 1; opr3 <= 8; opr3++) {
  178.                                             PerformOpr(opr3, 6, 5, idx4);
  179.                                             if (ArrayExpr[6].result == 24) {
  180.                                                 MakeExpr(ArrayExpr[6], 0);
  181.                                                 SubmitExpr();
  182.                                                 strexpr.clear();
  183.                                             }
  184.                                         }
  185.                                     }
  186.                                 }
  187.                             }
  188.                         }
  189.                     }
  190.                 }
  191.             }
  192.         }
  193.     }
  194.     // Mode 2 below
  195.     for (idx1 = 0; idx1 <= 3; idx1++) {
  196.         for (idx2 = 0; idx2 <= 3; idx2++) {
  197.             if (idx2 != idx1) {
  198.                 for (opr1 = 1; opr1 <= 8; opr1++) {
  199.                     PerformOpr(opr1, 4, idx1, idx2);
  200.                     for (idx3 = 0; idx3 <= 3; idx3++) {
  201.                         if ((idx3 != idx1) && (idx3 != idx2)) {
  202.                             for (idx4 = 0; idx4 <= 3; idx4++) {
  203.                                 if (((idx4 != idx1) && (idx4 != idx2)) && (idx4 != idx3)) {
  204.                                     for (opr2 = 1; opr2 <= 8; opr2++) {
  205.                                         PerformOpr(opr2, 5, idx3, idx4);
  206.                                         for (opr3 = 1; opr3 <= 8; opr3++) {
  207.                                             PerformOpr(opr3, 6, 4, 5);
  208.                                             if (ArrayExpr[6].result == 24) {
  209.                                                 MakeExpr(ArrayExpr[6], 0);
  210.                                                 SubmitExpr();
  211.                                                 strexpr.clear();
  212.                                             }
  213.                                         }
  214.                                     }
  215.                                 }
  216.                             }
  217.                         }
  218.                     }
  219.                 }
  220.             }
  221.         }
  222.     }
  223.     if (Solutions.size() == 0) {
  224.         cout << "There are no solutions found." << endl;
  225.     }
  226.    
  227.     return 0;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement