zoukankan      html  css  js  c++  java
  • hiho一下 第九十八周 搜索一·24点

    题目1 : 搜索一·24点

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    周末,小Hi和小Ho都在家待着。

    在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。

    小Ho:玩点什么好呢?

    小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。

    小Ho:好啊,好啊。

    <经过若干局游戏之后>

    小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?

    小Hi:让我想想。

    <过了几分钟>

    小Hi:我知道了!其实很简单嘛。

    提示:24点

    输入

    第1行:1个正整数, t,表示数据组数,2≤t≤100。

    第2..t+1行:4个正整数, a,b,c,d,1≤a,b,c,d≤10。

    输出

    第1..t行:每行一个字符串,第i行表示第i组能否计算出24点。若能够输出"Yes",否则输出"No"。

    样例输入
    2
    5 5 5 1
    9 9 9 9
    样例输出
    Yes
    No


    解题思路

    数据量不大,所以可以直接暴力枚举,4个数字,3个操作运算符,4个数字共有4!=24中可能,3个操作符共有4^3 共64种,因为有多种优先级次序,一次枚举。

    (A#B)#(C#D)
    ((A#B)#C)#D
    A#(B#(C#D))
    (A#(B#C))#D
    A#((B#C)#D)

    代码:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 double number[4]; 
     6 double nowNumber[4];
     7 char ops[3];
     8 char opType[4] = { '+', '-', '*', '/' };
     9 bool used[4]={false};
    10 int num;
    11 
    12 double calc(double a, double b, char c){
    13     double s = 0.0;
    14     switch (c)
    15     {
    16         case '+':        s = a + b;break;
    17         case '-':        s = a - b;break;
    18         case '*':        s = a*b;break;
    19         case '/':        if (b != 0) s = b / a;break;
    20         default:        break;
    21     }
    22     return s;
    23 }
    24 
    25 bool makeOperation(int depth){
    26     if(depth>=3){
    27         if (      calc(calc(number[0], number[1],ops[0]), calc(number[2], number[3],ops[1]),ops[2]) == 24      //(A#B)#(C#D) 
    28             ||       calc(calc(calc(number[0],number[1],ops[0]),number[2],ops[1]),number[3],ops[2]) == 24       //((A#B)#C)#D
    29             || calc(number[0], calc(number[1], calc(number[2], number[3], ops[2]), ops[1]), ops[0]) == 24       //A#(B#(C#D))
    30             || calc(calc(number[0], calc(number[1], number[2], ops[1]), ops[0]), number[3], ops[2]) == 24      //(A#(B#C))#D 
    31             || calc(number[0], calc(calc(number[1], number[2], ops[1]), number[3], ops[2]), ops[0]) == 24     //A#((B#C)#D)
    32             )          
    33             
    34             return true;
    35         else
    36             return false;
    37     } 
    38 
    39     for(int i=0;i<4;i++){
    40         ops[depth] = opType[i];
    41         if (makeOperation(depth + 1))
    42             return true;
    43     }
    44     return false;
    45 }
    46     
    47 bool makeNumber(int depth){
    48     if(depth>=4)
    49         return makeOperation(0);
    50     
    51     for(int i=0;i<4;i++){
    52         if(!used[i]){
    53             nowNumber[depth]=number[i];
    54             used[i]=false;
    55             
    56             if(makeNumber(depth+1))
    57                 return true;
    58                 
    59             used[i]=false;            
    60         }        
    61     }
    62     return false;
    63 }
    64 
    65 int main(){
    66     int n;
    67     cin>>n;
    68     
    69     while(n--){
    70         for (int i = 0; i < 4; i++)
    71             cin >> number[i];
    72 
    73         if (makeNumber(0))
    74             cout << "Yes" << endl;
    75         else
    76             cout << "No" << endl;
    77     } 
    78     return 0;
    79 }
    题解中给的思路是,引入“反-”和“反/”,运算符增加2种,优先级结合次序可以减少3中,效率更优。
     
  • 相关阅读:
    html5 历史管理
    html5小知识点
    html5的Form新特性
    html5语义化标签
    Comet反向ajax技术实现客服聊天系统
    Js类的静态方法与实例方法区分以及jQuery如何拓展两种方法
    浏览器中关于事件的那点事儿
    iOS 强制横竖屏方法 -
    编辑readme 文件 -
    iOS- FFmpeg库的编译
  • 原文地址:https://www.cnblogs.com/SeekHit/p/5508827.html
Copyright © 2011-2022 走看看