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中,效率更优。
 
原文地址:https://www.cnblogs.com/SeekHit/p/5508827.html