初中24点 初中24点计算方法与技巧

落雨知清辰 863
左侧宽880
左侧宽880
初中24点 初中24点计算方法与技巧 ICPC--1219: 速算24点题目描述

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断 是否有解。我们另外规定,整个计算过程中都不能出现小数。

输入

输入数据占一行,给定四张牌。

输出

如果有解则输出"Y",无解则输出"N"。

样例输入

A 2 3 6样例输出

Y代码

#include<bits/stdc++.h>using namespace std;int a[10]; // 输入的数字int num[10];int flag = 0;int get_num(string s){ if (s.size() == 2) return 10; if (s <= "9" && s >= "0") return s[0] - '0'; else if (s == "J") return 11; else if (s == "Q") return 12; else if (s == "K") return 13; else if (s == "A") return 1;}void dfs(int num, int d){ if (flag == 1) return; if (d == 3) { if (num == 24) flag = 1; return; } else { for (int i = 1; i <= 7; i++) { if (i == 1) dfs(num + a[d + 1], d + 1); if (i == 2) dfs(num - a[d + 1], d + 1); if (i == 3) dfs(num * a[d + 1], d + 1); if (a[d + 1] != 0 && i == 4 && num % a[d + 1] == 0) dfs(num / a[d + 1], d + 1); if (i == 5) dfs(a[d + 1] - num, d + 1); if (i == 6) dfs(a[d + 1] - num, d + 1); if (i == 7 && num != 0 && a[d + 1] % num == 0) dfs(a[d + 1] / num, d + 1); } } return;}void check_two(){ num[1] = a[0] + a[1], num[2] = a[0] - a[1], num[3] = a[0] * a[1]; if (a[0] % a[1] != 0) num[4] = -1000; else num[4] = a[0] / a[1]; num[5] = a[2] + a[3], num[6] = a[2] - a[3], num[7] = a[2] * a[3]; if (a[2] % a[3] != 0) num[8] = -1000; else num[8] = a[2] / a[3]; for (int i = 1; i <= 4; i++) { for (int j = 5; j <= 8; j++) { if (i == j || a[i] == -1000 || a[j] == -1000) continue; for (int k = 1; k <= 4; k++) { int num1 = 0; if (k == 1) num1 = num[i] + num[j]; if (k == 2) num1 = num[i] - num[j]; if (k == 3) num1 = num[i] * num[j]; if (k == 4) { if (num[j] != 0 && num[i] % num[j] == 0) num1 = num[i] / num[j]; else num1 = -1000; } if (num1 == 24) { flag = 1; return; } } } } flag = 0; return;}int main(){ string s; int cnt = 0; for (int i = 1; i <= 4; i++) { cin >> s; a[cnt++] = get_num(s); } sort(a, a + cnt); do { flag = 0; dfs(a[0], 0); if (flag != 1) check_two(); if (flag == 1) { cout << "Y" << endl; return 0; } } while (next_permutation(a, a + cnt)); cout << "N" << endl; return 0;}ICPC--1220: SO EASY

标签: 初中24点