zoukankan      html  css  js  c++  java
  • HDU 1247 速算24点

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #define CL(x, y) memset(x, y, sizeof(x))
      5 using namespace std;
      6 const int INF = 1 << 30;
      7 int num[4], res[4], used[4];
      8 int flag;
      9 int getNum(char ch);
     10 int calculate(int x,int y,int i);  //4步运算
     11 int checkNum();        //判断24
     12 void DFS(int k);    //全排列
     13 int main()
     14 {
     15     char ch;
     16     int i, j, k;
     17     while(cin>>ch)
     18     {
     19         for(i = 0; i < 4; i++)//输入有点讲究,十分重要
     20         {
     21             if(ch=='1')
     22             {
     23                 num[i] = 10;
     24                 cin >> ch;//输入为10的时候
     25             }
     26             else
     27             {
     28                 num[i] = getNum(ch);//将当前输入的字符转化为数字
     29             }
     30             if(i<3)
     31                 cin>>ch;
     32         }
     33         flag = 0;
     34         CL(used, 0);
     35         DFS(0);
     36         if(flag) printf("Yes
    ");
     37         else printf("No
    ");
     38     }
     39     return 0;
     40 }
     41 int getNum(char ch)
     42 {
     43     switch(ch)
     44     {
     45     case 'A':
     46         return 1;
     47     case 'J':
     48         return 11;
     49     case 'Q':
     50         return 12;
     51     case 'K':
     52         return 13;
     53     default:
     54         return ch-'0';
     55     }
     56 }
     57 int calculate(int x,int y,int i)  //4步运算
     58 {
     59     switch(i)
     60     {
     61     case 0 :
     62         return x + y;
     63     case 1 :
     64         return x - y;
     65     case 2 :
     66         return x * y;
     67     case 3 :
     68         if(y != 0 && !(x % y))
     69             return x / y;
     70         else
     71             return INF;
     72     }
     73 }
     74 void DFS(int k)    //全排列24
     75 {
     76     int i;
     77     if(k == 4)
     78     {
     79         if(checkNum()) flag = 1;
     80         return;
     81     }
     82     for(i = 0; i < 4; i ++)
     83     {
     84         if(!used[i])
     85         {
     86             res[k] = num[i];
     87             used[i] = 1;
     88             DFS(k + 1);
     89             if(flag) return;
     90             used[i] = 0;
     91         }
     92     }
     93 }
     94 int checkNum()        //判断24
     95 {
     96     int i,j,k;
     97     int t1,t2,t3;
     98     for(i = 0; i < 4; i ++)       //(a @ b) @ (c @ d)
     99     {
    100         t1 = calculate(res[0],res[1],i);
    101         if(t1 == INF) continue;
    102         for(j = 0; j < 4; j ++)
    103         {
    104             t2 = calculate(res[2],res[3],j);
    105             if(t2 == INF) continue;
    106             for(k = 0; k < 4; k ++)
    107             {
    108                 t3 = calculate(t1,t2,k);
    109                 if(t3 == 24) return 1;
    110             }
    111         }
    112     }
    113     for(i = 0; i < 4; i ++)   //((a @ b) @ c) @ d
    114     {
    115         t1 = calculate(res[0],res[1],i);
    116         if(t1 == INF) continue;
    117         for(j = 0; j < 4; j ++)
    118         {
    119             t2 = calculate(t1,res[2],j);
    120             if(t2 == INF) continue;
    121             for(k = 0; k < 4; k ++)
    122             {
    123                 t3 = calculate(t2,res[3],k);
    124                 if(t3 == 24) return 1;
    125             }
    126         }
    127     }
    128     for(i = 0; i < 4; i ++)   //(a @ (b @ c)) @ d
    129     {
    130         t1 = calculate(res[1],res[2],i);
    131         if(t1 == INF) continue;
    132         for(j = 0; j < 4; j ++)
    133         {
    134             t2 = calculate(res[0],t1,j);
    135             if(t2 == INF) continue;
    136             for(k = 0; k < 4; k ++)
    137             {
    138                 t3 = calculate(t2,res[3],k);
    139                 if(t3 == 24) return 1;
    140             }
    141         }
    142     }
    143     for(i = 0; i < 4; i ++)   //a @ (b @ (c @ d))
    144     {
    145         t1 = calculate(res[2],res[3],i);
    146         if(t1 == INF) continue;
    147         for(j = 0; j < 4; j ++)
    148         {
    149             t2 = calculate(res[1],t1,j);
    150             if(t2 == INF) continue;
    151             for(k = 0; k < 4; k ++)
    152             {
    153                 t3 = calculate(res[0],t2,k);
    154                 if(t3 == 24) return 1;
    155             }
    156         }
    157     }
    158     for(i = 0; i < 4; i ++)   //a @ ((b @ c) @ d)
    159     {
    160         t1 = calculate(res[1],res[2],i);
    161         if(t1 == INF) continue;
    162         for(j = 0; j < 4; j ++)
    163         {
    164             t2 = calculate(t1,res[3],j);
    165             if(t2 == INF) continue;
    166             for(k = 0; k < 4; k ++)
    167             {
    168                 t3 = calculate(res[0],t2,k);
    169                 if(t3 == 24) return 1;
    170             }
    171         }
    172     }
    173     return 0;    //无解
    174 }
    View Code

    24点问题:

    先不考虑括号,4个数是全排列,则有4!;

    3个运算符,每个运算符有4次选择机会,一共有4^3;

    接下来考虑括号的问题,则有5种方案:(A(B(CD))),(A((BC)D)),((AB)(CD)),((A(BC))D),(((AB)C)D)

    综上,一共有:4!* 4^3 * 5 = 1536种表达式;

  • 相关阅读:
    vector<vector<int>> 判断三个数为一组是否重复
    数位dp——hdu2089不要62
    nyoj1099 四点坐标判断正方形
    构造回文——最长公共子序列问题 java
    nyoj08 一种排序
    记录一个protobuf枚举类型引发问题的分析和思考
    记录一下996.icu
    Android N requires the IDE to be running with Java 1.8 or later
    使用fresco后引发的关于造轮子的思考
    使用了一段时间的instant run 记录一下遇到的问题
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4314138.html
Copyright © 2011-2022 走看看