Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <stack>
  4.  
  5. using namespace std;
  6.  
  7. //Counter jika ekspresi bernilai 24. Direset di main body.
  8. int ctr;
  9.  
  10. //Cek karakter operan dalam rangka konversi postfix ke infix.
  11. bool isOperand(char x)
  12. {
  13.    return (x >= 'a' && x <= 'z') ||
  14.           (x >= 'A' && x <= 'Z');
  15. }
  16.  
  17. //Konversi ekspresi postfix ke infix. Bermasalah karena tidak memroses spasi.
  18. string getInfix(string exp)
  19. {
  20.     stack<string> s;
  21.  
  22.     for (int i=0; exp[i]!='\0'; i++)
  23.     {
  24.         // Push operands
  25.         if (isOperand(exp[i]))
  26.         {
  27.            string op(1, exp[i]);
  28.            s.push(op);
  29.         }
  30.  
  31.         // We assume that input is
  32.         // a valid postfix and expect
  33.         // an operator.
  34.         else
  35.         {
  36.             string op1 = s.top();
  37.             s.pop();
  38.             string op2 = s.top();
  39.             s.pop();
  40.             s.push("(" + op2 + exp[i] +
  41.                    op1 + ")");
  42.         }
  43.     }
  44.  
  45.     // There must be a single element
  46.     // in stack now which is the required
  47.     // infix.
  48.     return s.top();
  49. }
  50.  
  51. //Cek karakter operator dalam rangka melakukan kalkulasi terhadap ekspresi posfix
  52. bool isOperator(char ch)
  53. {
  54.     if (ch=='+' || ch=='-' || ch=='*' || ch=='/')
  55.         return true;
  56.     else
  57.         return false;
  58. }
  59.  
  60. //Kalkulator untuk evaluasi ekspresi postfix
  61. int performOperation(int op1, int op2, char op)
  62. {
  63.     int ans;
  64.     switch(op){
  65.     case '+':
  66.         ans = op2 + op1;
  67.         break;
  68.     case '-':
  69.         ans = op2 - op1;
  70.         break;
  71.     case '*':
  72.         ans = op2 * op1;
  73.         break;
  74.     case '/':
  75.         ans = op2 / op1;
  76.         break;
  77.     }
  78.     return ans;
  79. }
  80.  
  81. //Evaluator ekspresi Reverse Polish Notation. Bermasalah karena memiliki kasus error yang tidak tertangani.
  82. int EvaluatePostfix(string exp){
  83.     int i,op1, op2, len, j = 0, x;
  84.     char buffer[15];
  85.     len = 13;
  86.     stack<int> s;
  87.    
  88.     for(i=0; i<len;i++){
  89.  
  90.         if(exp[i]>='0' && exp[i]<='9'){
  91.             buffer[j++] = exp[i];
  92.         }
  93.         else if(exp[i]==' '){
  94.             if(j>0){
  95.                 buffer[j] = '\0';
  96.                 x = atoi(buffer);
  97.                 s.push(x);
  98.                 j = 0;
  99.             }
  100.         }
  101.  
  102.         else if(isOperator(exp[i])){
  103.             op1 = s.top();
  104.             s.pop();
  105.             op2 = s.top();
  106.             s.pop();
  107.             s.push(performOperation(op1, op2, exp[i]));
  108.         }
  109.     }
  110. }
  111.  
  112. //Prosedur pemanggil evaluator dan konverter.
  113. //Karena masalah dalam kedua fungsi tsb, sementara hanya mengenumerasi seluruh 7680 kemungkinan.
  114. void hitung(string s){
  115.     cout << s;
  116.    
  117.     //if(EvaluatePostfix(s) == 24){
  118.         //cout << getInfix(s);
  119.         ctr++;
  120.     //}
  121.    
  122.     cout << endl;
  123. }
  124.  
  125. //Daftar operator dalam rangka kombinasi operator
  126. char operative(int n){
  127.     switch(n){
  128.         case 1 : return '+';
  129.         case 2 : return '-';
  130.         case 3 : return '*';
  131.         case 4 : return '/';
  132.     }
  133. }
  134.  
  135. //Kombinasi operator dan parser menurut 5 kemungkinan postfix parse tree
  136. void triplet_op(int *a){
  137.     string op;
  138.    
  139.     //Misalkan A sembarang operator, dan N sembarang integer
  140.     //N N N N A A A
  141.     //N N N A N A A
  142.     //N N N A A N A
  143.     //N N A N N A A
  144.     //N N A N A N A
  145.    
  146.     for(int i=1; i<=4; i++){
  147.         op = operative(i);
  148.         op += " ";
  149.        
  150.         for(int j=1; j<=4; j++){
  151.             op += operative(j);
  152.             op += " ";
  153.            
  154.             for(int k=1; k<=4; k++){
  155.                 op += operative(k);
  156.                
  157.                 hitung((char)(*a + '0') + string(" ") + (char)(*(a+1)+'0') + string(" ") + (char)(*(a+2)+'0') + string(" ") + (char)(*(a+3)+'0') + string(" ") + op);
  158.                 hitung((char)(*a + '0') + string(" ") + (char)(*(a+1)+'0') + string(" ") + (char)(*(a+2)+'0') + string(" ") + op[0] + string(" ") + (char)(*(a+3)+'0') + string(" ") + op.substr(2));
  159.                 hitung((char)(*a + '0') + string(" ") + (char)(*(a+1)+'0') + string(" ") + (char)(*(a+2)+'0') + string(" ") + op[0] + string(" ") + op[2] + string(" ") + (char)(*(a+3)+'0') + string(" ") + op[4]);
  160.                 hitung((char)(*a + '0') + string(" ") + (char)(*(a+1)+'0') + string(" ") + op[0] + string(" ") + (char)(*(a+2)+'0') + string(" ") + (char)(*(a+3)+'0') + string(" ") + op.substr(2));
  161.                 hitung((char)(*a + '0') + string(" ") + (char)(*(a+1)+'0') + string(" ") + op[0] + string(" ") + (char)(*(a+2)+'0') + string(" ") + op[2] + string(" ") + (char)(*(a+3)+'0') + string(" ") + op[4]);
  162.                
  163.                 op.pop_back();
  164.             }
  165.             op.pop_back();
  166.             op.pop_back();
  167.         }
  168.     }
  169.    
  170.    
  171. }
  172.  
  173. //Fungsi swap member array dalam rangka permutasi integer masukan
  174. void swap(int *x, int *y)
  175. {
  176.     int temp;
  177.     temp = *x;
  178.     *x = *y;
  179.     *y = temp;
  180. }
  181.  
  182. //Fungsi permutasi integer masukan
  183. void permute(int *a, int l, int r)
  184. {
  185.    int i;
  186.    if (l == r)
  187.    {
  188.         triplet_op(a);
  189.    }
  190.    else
  191.    {
  192.        for (i = l; i <= r; i++)
  193.        {
  194.           swap((a+l), (a+i));
  195.           permute(a, l+1, r);
  196.           swap((a+l), (a+i));
  197.        }
  198.    }
  199. }
  200.  
  201.  
  202.  
  203. int main(){
  204.     cout << '\n' <<"--------------WELCOME TO 24SOLVER!--------------" << '\n';
  205.     cout << "Tugas Kecil Kuliah Strategi Algoritma (IF2211)" << '\n';
  206.     cout << "Nama   : Harry Prabowo" << '\n' << "NIM    : 13517094" << '\n';
  207.     cout << '\n' << "Masukkan 4 angka, masing-masing dalam baris baru." << '\n';
  208.    
  209.     //Dapat mencoba program hingga force-close.
  210.     do{
  211.         int n = 0, arr[4];
  212.        
  213.         ctr = 0;
  214.        
  215.         //Proses input user & passing ke array
  216.         while(n < 4)
  217.             cin >> arr[n++];
  218.        
  219.         permute(&arr[0], 0, 3);
  220.        
  221.         cout << "Terdapat " << ctr << " solusi." << endl;
  222.        
  223.     } while(1);
  224.    
  225.     cout << "\n\n" << "------------------Terima kasih------------------" << '\n';
  226.    
  227.     return 0;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement