加减乘除24点(难度系数:2颗星)
来源:互联网 发布:网络研修中的困惑 编辑:程序博客网 时间:2024/06/09 13:54
问题描述:
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用’+’,’-‘,’*’,’/’运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。
输入:
每组输入数据占一行,给定四张牌。
输出:
如果有解,则输出一种可行的解决方案(参看输出样例),否则输出NO SOLUTION
输入样例:
A 2 3 6
3 3 8 8
输出样例
参看代码:
#include<stdio.h>char str[4][3];int arrCard[4];int IsFindSolution(int n, int step, char solution[3][20]){ int i, j, k, nTemp1, nTemp2; if (1 == n)//到这里已经算出最后结果了 { if (24 == arrCard[0]) { for (k = 0; k < 3; k++) printf("步骤%d: %s\n", k + 1, solution[k]); return 1; } else return 0; } for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { nTemp1 = arrCard[i]; nTemp2 = arrCard[j]; arrCard[j] = arrCard[n - 1]; arrCard[i] = nTemp1 + nTemp2; sprintf_s(solution[step - 1], 20, "%d + %d = %d", nTemp1, nTemp2, nTemp1 + nTemp2); if (IsFindSolution(n - 1, step + 1, solution)) return 1; arrCard[i] = nTemp1 - nTemp2; sprintf_s(solution[step - 1], 20, "%d - %d = %d", nTemp1, nTemp2, nTemp1 - nTemp2); if (IsFindSolution(n - 1, step + 1, solution)) return 1; arrCard[i] = nTemp2 - nTemp1; sprintf_s(solution[step - 1], 20, "%d - %d = %d", nTemp2, nTemp1, nTemp2 - nTemp1); if (IsFindSolution(n - 1, step + 1, solution)) return 1; arrCard[i] = nTemp1 * nTemp2; sprintf_s(solution[step - 1], 20, "%d * %d = %d", nTemp1, nTemp2, nTemp1 * nTemp2); if (IsFindSolution(n - 1, step + 1, solution)) return 1; if (nTemp1 && nTemp2 % nTemp1 == 0) { arrCard[i] = nTemp2 / nTemp1; sprintf_s(solution[step - 1], 20, "%d / %d = %d", nTemp2, nTemp1, nTemp2 / nTemp1); if (IsFindSolution(n - 1, step + 1, solution)) return 1; } if (nTemp2 && nTemp1 % nTemp2 == 0) { arrCard[i] = nTemp1 / nTemp2; sprintf_s(solution[step - 1], 20, "%d / %d = %d", nTemp1, nTemp2, nTemp1 / nTemp2); if (IsFindSolution(n - 1, step + 1, solution)) return 1; } arrCard[i] = nTemp1; arrCard[j] = nTemp2; } } return 0;}int ChangeCardPoint(char* str){//把输入的字符串转成整数 if (0 == stricmp(str, "A")) return 1; if (0 == stricmp(str, "10")) return 10; if (0 == stricmp(str, "J")) return 11; if (0 == stricmp(str, "Q")) return 12; if (0 == stricmp(str, "K")) return 13; return str[0] - '0';}int main(){ char solution[3][20]; int i = 0; while (scanf_s("%s%s%s%s", str[0], 3, str[1], 3, str[2], 3, str[3], 3) == 4) { for (i = 0; i < 4; i++) arrCard[i] = ChangeCardPoint(str[i]); if (IsFindSolution(4, 1, solution)); else printf("NO SOLUTION\n"); } return 0;}
4 0
- 加减乘除24点(难度系数:2颗星)
- 迭代法计算平方根(难度系数:2颗星)
- 数列的逆序数对(难度系数:2颗星)
- 计算器(难度系数:3颗星)
- 拼音读数字(难度系数:1颗星)
- 输出菱形图案(难度系数:1颗星)
- 随机生成数字放入数组(难度系数:1颗星)
- 找规律输出正方形(难度系数:2)
- leetcode Two Sum 2.1 难度系数2
- leetcode Reverse Integer 2.2 难度系数2
- leetcode Palindrome Number 2.4 难度系数2
- leetcode Valid Parentheses 2.8 难度系数2
- leetcode Valid Sudoku 2.12 难度系数2
- leetcode Valid Number 2.15 难度系数2
- leetcode Add Binary 2.16 难度系数2
- leetcode Climbing Stairs 2.17 难度系数2
- leetcode Valid Palindrome 难度系数2 2.25
- 水仙花数(难度系数:半颗星)
- 使用Android JNI调用第三方静态库并且生成静态库和动态库(armeabi/arm64-v8a版本)的配置操作
- android-加固方案对比
- 警告框的使用
- House Robber
- Gradle使用初体验
- 加减乘除24点(难度系数:2颗星)
- 对‘sqrt’未定义的引用 collect2: error: ld returned 1 exit status
- Spring事务之三(DriverManagerDataSource)
- jsp 模拟按钮,点击button,链接到a标签,是a标签的地址跳转
- C++对象模型-简述c++对象的内存布局
- HTML5之文档结构标签
- Fragment简介
- 代词的用法
- 用R做数据分析必须的4个理由