华为OJ平台练习题--24点游戏
来源:互联网 发布:递归算法java 编辑:程序博客网 时间:2024/06/06 01:13
华为的OJ平台上有两道24点的习题,一道是初级的,仅仅是从1-10中随机取4个数字(可以相同),计算能否通过加减乘除得到24点。另一道是中级的,通过给出4张纸牌计算能否得到24点。
目前采用的方法仅仅是暴力解,代码如下:
第一题的代码如下:
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; void preDeal(vector<string> &res, string str) { for (int i = 0; i < (int)str.size(); ++i) { if (str[i] == '+' || str[i] == '*' || str[i] == '/' || str[i] == '(' || str[i] == ')') res.push_back(str.substr(i, 1)); else if (str[i] == '-') { if (i == 0 || (!isalnum(str[i - 1]) && str[i - 1] != ')')) //&&str[i - 1] != ']'&&str[i - 1] != '}' { int j = 1; i++; while (i + j <(int)str.size() && isalnum(str[i + j])) ++j; string s = "-" + str.substr(i, j); res.push_back(s); i += j - 1; } else res.push_back("-"); } else if (str[i] == '[' || str[i] == '{') res.push_back("("); else if (str[i] == ']' || str[i] == '}') res.push_back(")"); else { int j = 1; while (i + j <(int)str.size() && isalnum(str[i + j])) ++j; res.push_back(str.substr(i, j)); i += j - 1; } } } int calculate(int b, int a, string s,bool &can) { if (s == "+") return a + b; else if (s == "-") return a - b; else if (s == "*") return a*b; else { if (a%b == 0) { return a / b; } can = false; return -10000; } } int getAnswer(vector<string> res,bool &can) { if (res.empty()) return 0; vector<string> op; vector<int> val; for (int i = 0; i < (int)res.size(); i++) { if (res[i] == "+" || res[i] == "-") { if (op.empty()) op.push_back(res[i]); else { while (op.size() != 0 && (op[(int)op.size() - 1] == "*" || op[(int)op.size() - 1] == "/" || op[(int)op.size() - 1] == "+" || op[(int)op.size() - 1] == "-")) { int a = val.back(); val.pop_back(); int b = val.back(); val.pop_back(); string s = op.back(); op.pop_back(); val.push_back(calculate(a, b, s,can)); if (can == false) return -100000; } op.push_back(res[i]); } } else if (res[i] == "*" || res[i] == "/") { if (op.empty()) op.push_back(res[i]); else { if (op[(int)op.size() - 1] == "*" || op[(int)op.size() - 1] == "/") { int a = val.back(); val.pop_back(); int b = val.back(); val.pop_back(); string s = op.back(); op.pop_back(); val.push_back(calculate(a, b, s,can)); if (can == false) return -100000; } op.push_back(res[i]); } } else { val.push_back(atoi(res[i].c_str())); } } while (!op.empty()) { double a = val.back(); val.pop_back(); double b = val.back(); val.pop_back(); string s = op.back(); op.pop_back(); val.push_back(calculate(a, b, s,can)); if (can == false) return -100000; } if (val.empty()) return 0; return val[0]; } int main() { int number[4]; int a; char cal[4] = { '+','-','*','/' }; for(int i=0;i<4;i++) { cin>>a; number[i]=a; } do { char c[3]; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) for (int k = 0; k < 4; k++) { c[0] = cal[i]; c[1] = cal[j]; c[2] = cal[k]; string s1; for (int i = 0; i < 4; i++) { if (number[i] >= 1 && number[i] <= 9) s1.push_back('0' + number[i]); else if (number[i] == 10) s1 += "10"; if (i<3) s1.push_back(c[i]); } vector<string> temp; preDeal(temp, s1); bool can = true; int sum = getAnswer(temp,can); if(sum==24) { cout<<"true"<<endl; return 0; } } }while(next_permutation(number, number + 4)); cout<<"false"<<endl; return 0; }
第二题采用的还是暴力解,代码如下:
#include <string> #include <algorithm> #include <vector> #include <iostream> using namespace std; int change(char ch) { switch (ch) { case 'A':return 1; case '2':return 2; case '3':return 3; case '4':return 4; case '5':return 5; case '6':return 6; case '7':return 7; case '8':return 8; case '9':return 9; case 'J':return 11; case 'Q':return 12; case 'K':return 13; default: break; } return 0; } void preDeal(vector<string> &res, string str) { for (int i = 0; i < (int)str.size(); ++i) { if (str[i] == '+' || str[i] == '*' || str[i] == '/' || str[i] == '(' || str[i] == ')') res.push_back(str.substr(i, 1)); else if (str[i] == '-') { if (i == 0 || (!isalnum(str[i - 1]) && str[i - 1] != ')')) //&&str[i - 1] != ']'&&str[i - 1] != '}' { int j = 1; i++; while (i + j <(int)str.size() && isalnum(str[i + j])) ++j; string s = "-" + str.substr(i, j); res.push_back(s); i += j - 1; } else res.push_back("-"); } else if (str[i] == '[' || str[i] == '{') res.push_back("("); else if (str[i] == ']' || str[i] == '}') res.push_back(")"); else { int j = 1; while (i + j <(int)str.size() && isalnum(str[i + j])) ++j; res.push_back(str.substr(i, j)); i += j - 1; } } } int calculate(int b, int a, string s,bool &can) { if (s == "+") return a + b; else if (s == "-") return a - b; else if (s == "*") return a*b; else { if (a%b == 0) { return a / b; } can = false; return -10000; } } int getAnswer(vector<string> res,bool &can) { if (res.empty()) return 0; vector<string> op; vector<int> val; for (int i = 0; i < (int)res.size(); i++) { if (res[i] == "+" || res[i] == "-") { if (op.empty()) op.push_back(res[i]); else { while (op.size() != 0 && (op[(int)op.size() - 1] == "*" || op[(int)op.size() - 1] == "/" || op[(int)op.size() - 1] == "+" || op[(int)op.size() - 1] == "-")) { int a = val.back(); val.pop_back(); int b = val.back(); val.pop_back(); string s = op.back(); op.pop_back(); val.push_back(calculate(a, b, s,can)); if (can == false) return -100000; } op.push_back(res[i]); } } else if (res[i] == "*" || res[i] == "/") { if (op.empty()) op.push_back(res[i]); else { if (op[(int)op.size() - 1] == "*" || op[(int)op.size() - 1] == "/") { int a = val.back(); val.pop_back(); int b = val.back(); val.pop_back(); string s = op.back(); op.pop_back(); val.push_back(calculate(a, b, s,can)); if (can == false) return -100000; } op.push_back(res[i]); } } else { val.push_back(atoi(res[i].c_str())); } } while (!op.empty()) { double a = val.back(); val.pop_back(); double b = val.back(); val.pop_back(); string s = op.back(); op.pop_back(); val.push_back(calculate(a, b, s,can)); if (can == false) return -100000; } if (val.empty()) return 0; return val[0]; } string unchange(int i) { switch (i) { case '1':return "A"; case '2':return "2"; case '3':return "3"; case '4':return "4"; case '5':return "5"; case '6':return "6"; case '7':return "7"; case '8':return "8"; case '9':return "9"; case '10':return "10"; case '11':return "J"; case '12':return "Q"; case '13':return "K"; default: break; } return ""; } int main() { string s[4]; int number[4] = { 0 }; char cal[4] = { '+','-','*','/' }; unsigned int i = 0, j = 0, k = 0,sum=0; bool cancal = false; string str; getline(cin, str); while (i < str.size()) { if (str[i] == ' ') { s[k] = str.substr(j, i - j); if (s[k] == "JOKER" || s[k] == "joker") { cout << "ERROR" << endl; return 0; } if (s[k].size() == 1) number[k] = change(s[k][0]); else number[k] = 10; k++; j = i + 1; } else if (i == str.size() - 1) { s[k] = str.substr(j, i - j + 1); if (s[k] == "JOKER" || s[k] == "joker") { cout << "ERROR" << endl; return 0; } if (s[k].size() == 1) number[k] = change(s[k][0]); else number[k] = 10; } i++; } //sort(number, number + 4); do { char c[3]; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) for (int k = 0; k < 4; k++) { c[0] = cal[i]; c[1] = cal[j]; c[2] = cal[k]; string s1; for (int i = 0; i < 4; i++) { if (number[i] >= 1 && number[i] <= 9) s1.push_back('0' + number[i]); else if (number[i] == 10) s1 += "10"; else if (number[i] == 11) s1 += "11"; else if (number[i] == 12) s1 += "12"; else if (number[i] == 13) s1 += "13"; if (i<3) s1.push_back(c[i]); } vector<string> temp; preDeal(temp, s1); bool can = true; sum = getAnswer(temp,can); if (can&&sum==24) { for (int i = 0; i < 4; i++) { if(number[i]==1) cout<<"A"; else if(number[i]==11) cout<<"J"; else if(number[i]==12) cout<<"Q"; else if(number[i]==13) cout<<"K"; else cout << number[i]; if (i < 3) cout << c[i]; } cout << endl; cancal = true; } sum = 0; can = true; } } while (next_permutation(number, number + 4)); if (!cancal) cout << "NONE" << endl; return 0; }
0 0
- 华为OJ平台练习题--24点游戏
- 【华为OJ平台练习题】
- 华为OJ平台练习题
- 华为oj 24点游戏
- 华为OJ(24点游戏)
- 华为oj 24点游戏算法
- 【华为OJ】【097-24点游戏算法】
- 华为OJ 初级:24点游戏算法
- 24点游戏算法-华为OJ
- 华为OJ:24点游戏算法
- 华为oj初级 24点游戏算法
- 【华为OJ平台练习题】逆序输出字符串
- 【华为OJ平台练习题】Ascii码排序
- 华为OJ(扑克牌之24点游戏)
- 华为OJ——24点游戏算法
- [华为OJ--C++]097-24点游戏算法
- 华为OJ训练之0022-170107-24点游戏
- 华为OJ——24点游戏算法
- 基于视频压缩的实时监控系统-A5:net.c代码解析
- 基于视频压缩的实时监控系统-A4:main.c代码解析
- LeetCode:Rotate Image
- 搭建高可用的MongoDB集群:MongoDB的配置与副本集
- JAVA WEB 实现第三方登录 -- qq篇
- 华为OJ平台练习题--24点游戏
- poi操作生成表
- 基于视频压缩的实时监控系统-A6:cam.c代码解析
- 企业级分布式缓存技术之--mongodb详解
- iOS进阶(一)block与property
- Linux编写一个简单的进度条
- 基于视频压缩的实时监控系统-A7:cfg.c代码解析
- 正则表达式(来着马士兵老师的资料)
- 解决android studio和tomcat之间数据交互乱码问题