华为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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 羁押期限已满怎么办 刑事拘留22天了怎么办 被派出所拘留 车怎么办 被公安怀疑贩毒怎么办 报案后证据不足怎么办 担心丈夫复嫖怎么办 交通事故当事人重伤笔录怎么办 交通事故做完笔录后怎么办 罚款单子丢了怎么办 刑事案件人跑了怎么办 打架当事人跑了怎么办 赌博被派出所抓怎么办 治安案件人跑了怎么办 去警察局做笔录怎么办 未成年打架留下案底怎么办 土地被别人侵占怎么办 在公安局有案底怎么办 做小姐有案底怎么办 党员被黑社会打怎么办 周期内被扣15分怎么办 驾证扣了50分怎么办? 酒驾拘留工作怎么办 开电动车被拘留怎么办 有一次吸毒案底怎么办 家里收到拘留书怎么办 吸毒有案底结婚怎么办 坐牢了房子按揭怎么办 被刑事拘留15天怎么办 看守所没人交生活费怎么办 判刑后看守所拒收怎么办 上海小孩怎么办图书证 渝北区回兴怎么办户口 赌博罪进看守所怎么办 无法盘腿坐疼怎么办 在看守所不会盘腿怎么办 广州入户信息卡怎么办 工商局被投诉了怎么办 公安到预审阶段怎么办 找的律师不行怎么办 犯了刑事案件该怎么办 在派出所被打怎么办