1600: Twenty-four point
Time Limit: 1 Sec Memory Limit:
128 MB
Submit: 296 Solved: 38
Description
Given four numbers, can you get twenty-four through the addition, subtraction, multiplication, and division? Each number can be used only once.
Input
The input consists of multiple test cases. Each test case contains 4 integers A, B, C, D in a single line (1 <= A, B, C, D <= 13).
Output
For each case, print the “Yes” or “No”. If twenty-four point can be get, print “Yes”, otherwise, print “No”.
Sample Input
2 2 3 9 1 1 1 1 5 5 5 1
Sample Output
Yes No Yes
HINT
For the first sample, (2/3+2)*9=24.
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1600
题目大意:给四个数判断能否算出24
题目分析:直接DFS爆搜,每次计算两个数字再放进数组,知道数组里只有一个数为止
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; double EPS = 1e-10; double num[4]; bool flag; bool equel(double a, double b) { if(fabs(a - b) <= EPS) return true; return false; } void DFS(int n) { if(flag || (n == 1 && equel(num[0], 24))) { flag = true; return; } for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { double c1 = num[i], c2 = num[j]; num[j] = num[n - 1]; num[i] = c1 + c2; DFS(n - 1); num[i] = c1 - c2; DFS(n - 1); num[i] = c2 - c1; DFS(n - 1); num[i] = c1 * c2; DFS(n - 1); if(!equel(c2, 0)) { num[i] = c1 / c2; DFS(n - 1); } if(!equel(c1, 0)) { num[i] = c2 / c1; DFS(n - 1); } num[i] = c1; num[j] = c2; } } } int main() { while(scanf("%lf %lf %lf %lf", &num[0], &num[1], &num[2], &num[3]) != EOF) { flag = false; DFS(4); printf("%s\n", flag ? "Yes" : "No"); } }
另外考虑,输出解的个数和所有解的方法,其实只要用字符串记录一下就可以了
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> #include <string> using namespace std; double EPS = 1e-10; double num[4]; bool flag; int cnt; string re[4]; bool equel(double a, double b) { if(fabs(a - b) <= EPS) return true; return false; } void DFS(int n) { if(n == 1 && equel(num[0], 24)) { cnt ++; cout << re[0] << endl; return; } for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { double c1 = num[i], c2 = num[j]; string re1, re2; num[j] = num[n - 1]; num[i] = c1 + c2; re1 = re[i]; re2 = re[j]; re[j] = re[n - 1]; re[i] = '(' + re1 + '+' + re2 + ')'; DFS(n - 1); num[i] = c1 - c2; re[i] = '(' + re1 + '-' + re2 + ')'; DFS(n - 1); num[i] = c2 - c1; re[i] = '(' + re2 + '+' + re1 + ')'; DFS(n - 1); num[i] = c1 * c2; re[i] = '(' + re1 + '*' + re2 + ')'; DFS(n - 1); if(!equel(c2, 0)) { num[i] = c1 / c2; re[i] = '(' + re1 + '/' + re2 + ')'; DFS(n - 1); } if(!equel(c1, 0)) { num[i] = c2 / c1; re[i] = '(' + re2 + '/' + re1 + ')'; DFS(n - 1); } num[i] = c1; num[j] = c2; re[i] = re1; re[j] = re2; } } } int main() { while(scanf("%lf %lf %lf %lf", &num[0], &num[1], &num[2], &num[3]) != EOF) { re[0] = num[0] + '0'; re[1] = num[1] + '0'; re[2] = num[2] + '0'; re[3] = num[3] + '0'; cnt = 0; DFS(4); printf("Answer num: %d\n", cnt); } }
时间: 2024-10-29 19:06:54