Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.55 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;
  19.     ExprPtr oprd2;
  20.     int opr;
  21.     float result;
  22. } Expr;
  23.  
  24. Expr ArrayExpr[7];
  25.  
  26. string strexpr;
  27.  
  28. vector <string> Solutions;
  29.  
  30. void PerformOpr (int x, int ArrayIdx, int Oprd1Idx, int Oprd2Idx)
  31. {
  32.     /* 6 possible operations:
  33.     Opr 1: num1 + num2
  34.     Opr 2: num1 - num2
  35.     Opr 3: num1 * num2
  36.     Opr 4: num1 / num2
  37.     Opr 5: num2 - num1
  38.     Opr 6: num2 / num1 */
  39.     if (x == 1) {
  40.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  41.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  42.         ArrayExpr[ArrayIdx].opr = 1;
  43.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result + ArrayExpr[ArrayIdx].oprd2->result;
  44.     }
  45.     else if (x == 2) {
  46.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  47.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  48.         ArrayExpr[ArrayIdx].opr = 2;
  49.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result - ArrayExpr[ArrayIdx].oprd2->result;
  50.     }
  51.     else if (x == 3) {
  52.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  53.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  54.         ArrayExpr[ArrayIdx].opr = 3;
  55.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result * ArrayExpr[ArrayIdx].oprd2->result;
  56.     }
  57.     else if (x == 4) {
  58.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd1Idx];
  59.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd2Idx];
  60.         ArrayExpr[ArrayIdx].opr = 4;
  61.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result / ArrayExpr[ArrayIdx].oprd2->result;
  62.     }
  63.     else if (x == 5) {
  64.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd2Idx];
  65.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd1Idx];
  66.         ArrayExpr[ArrayIdx].opr = 2;
  67.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result - ArrayExpr[ArrayIdx].oprd2->result;
  68.     }
  69.     else if (x == 6) {
  70.         ArrayExpr[ArrayIdx].oprd1 = &ArrayExpr[Oprd2Idx];
  71.         ArrayExpr[ArrayIdx].oprd2 = &ArrayExpr[Oprd1Idx];
  72.         ArrayExpr[ArrayIdx].opr = 4;
  73.         ArrayExpr[ArrayIdx].result = ArrayExpr[ArrayIdx].oprd1->result / ArrayExpr[ArrayIdx].oprd2->result;
  74.     }
  75. }
  76.  
  77. void MakeExpr (Expr a, int itrtion)
  78. {  
  79.     int temp;
  80.    
  81.     if (a.oprd1 == NULL) {
  82.         temp = (int) a.result;
  83.         strexpr.append(to_string(temp));
  84.     }
  85.     else {
  86.         if (itrtion > 0) {
  87.             strexpr.append("(");
  88.         }
  89.         MakeExpr(*a.oprd1, itrtion + 1);
  90.         if (a.opr == 1) {
  91.             strexpr.append("+");
  92.         }
  93.         else if (a.opr == 2) {
  94.             strexpr.append("-");
  95.         }
  96.         else if (a.opr == 3) {
  97.             strexpr.append("*");
  98.         }
  99.         else if (a.opr == 4) {
  100.             strexpr.append("/");
  101.         }
  102.         MakeExpr(*a.oprd2, itrtion + 1);
  103.         if (itrtion > 0) {
  104.             strexpr.append(")");
  105.         }
  106.     }
  107. }
  108.  
  109. void SubmitExpr ()
  110. /* Checks if a solution already exists.
  111. Yes: the solution will be discarded.
  112. No: the solution will be included in the vector of solutions. */
  113. {
  114.     bool SolutionFound = false;
  115.     int NumSolutions = Solutions.size();
  116.     if (NumSolutions > 0) {
  117.         int x = 0;
  118.         while ((!SolutionFound) && (x < NumSolutions)) {
  119.             if (Solutions[x] == strexpr) {
  120.                 SolutionFound = true;
  121.             }
  122.             else {
  123.                 x++;
  124.             }
  125.         }
  126.     }
  127.     if (!SolutionFound) {
  128.         Solutions.push_back(strexpr);
  129.         cout << Solutions.size() << ". ";
  130.         cout << Solutions[NumSolutions] << endl;
  131.     }
  132.     strexpr.clear();
  133. }
  134.  
  135. int main()
  136. {
  137.     int idx1, idx2, idx3, idx4, opr1, opr2, opr3;
  138.    
  139.     printf("Welcome to 24 Game Solver!\n");
  140.     printf("Enter your 4 numbers below:\n");
  141.     for (int x = 0; x <= 3; x++) {
  142.         cin >> ArrayExpr[x].result;
  143.         ArrayExpr[x].oprd1 = NULL;
  144.         ArrayExpr[x].oprd2 = NULL;
  145.         ArrayExpr[x].opr = 0;
  146.     }
  147.     // Mode 1 below
  148.     for (idx1 = 0; idx1 <= 3; idx1++) {
  149.         for (idx2 = 0; idx2 <= 3; idx2++) {
  150.             if (idx2 != idx1) {
  151.                 for (opr1 = 1; opr1 <= 6; opr1++) {
  152.                     PerformOpr(opr1, 4, idx1, idx2);
  153.                     for (idx3 = 0; idx3 <= 3; idx3++) {
  154.                         if ((idx3 != idx1) && (idx3 != idx2)) {
  155.                             for (opr2 = 1; opr2 <= 6; opr2++) {
  156.                                 PerformOpr(opr2, 5, 4, idx3);
  157.                                 for (idx4 = 0; idx4 <= 3; idx4++) {
  158.                                     if (((idx4 != idx1) && (idx4 != idx2)) && (idx4 != idx3)) {
  159.                                         for (opr3 = 1; opr3 <= 6; opr3++) {
  160.                                             PerformOpr(opr3, 6, 5, idx4);
  161.                                             if (ArrayExpr[6].result == 24) {
  162.                                                 MakeExpr(ArrayExpr[6], 0);
  163.                                                 SubmitExpr();
  164.                                                 strexpr.clear();
  165.                                             }
  166.                                         }
  167.                                     }
  168.                                 }
  169.                             }
  170.                         }
  171.                     }
  172.                 }
  173.             }
  174.         }
  175.     }
  176.     // Mode 2 below
  177.     for (idx1 = 0; idx1 <= 3; idx1++) {
  178.         for (idx2 = 0; idx2 <= 3; idx2++) {
  179.             if (idx2 != idx1) {
  180.                 for (opr1 = 1; opr1 <= 6; opr1++) {
  181.                     PerformOpr(opr1, 4, idx1, idx2);
  182.                     for (idx3 = 0; idx3 <= 3; idx3++) {
  183.                         if ((idx3 != idx1) && (idx3 != idx2)) {
  184.                             for (idx4 = 0; idx4 <= 3; idx4++) {
  185.                                 if (((idx4 != idx1) && (idx4 != idx2)) && (idx4 != idx3)) {
  186.                                     for (opr2 = 1; opr2 <= 6; opr2++) {
  187.                                         PerformOpr(opr2, 5, idx3, idx4);
  188.                                         for (opr3 = 1; opr3 <= 6; opr3++) {
  189.                                             PerformOpr(opr3, 6, 4, 5);
  190.                                             if (ArrayExpr[6].result == 24) {
  191.                                                 MakeExpr(ArrayExpr[6], 0);
  192.                                                 SubmitExpr();
  193.                                                 strexpr.clear();
  194.                                             }
  195.                                         }
  196.                                     }
  197.                                 }
  198.                             }
  199.                         }
  200.                     }
  201.                 }
  202.             }
  203.         }
  204.     }
  205.     if (Solutions.size() == 0) {
  206.         cout << "There are no solutions found." << endl;
  207.     }
  208.    
  209.     return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement