LeetCode 679. 24 点游戏

逃离我推掉我的手 2022-11-29 14:29 332阅读 0赞

题目链接:

https://leetcode-cn.com/problems/24-game/

思路:非常经典的暴搜题。虽然没有什么算法,但却是练习dfs的好机会。

本质就是不断从数组中取出两个数,进行加减乘除运算,然后将新值在放入数组中。

剪枝有两个方向,第一当找到能得到24的组合时,结束递归。

第二,加法和乘法有交换性。

  1. class Solution {
  2. public:
  3. double eps = 1e-5;
  4. bool ans=0;
  5. bool judgePoint24(vector<int>& nums) {
  6. vector<double> vec;
  7. for(auto t:nums) vec.push_back(t);
  8. dfs(vec);
  9. //cout<<ans<<endl;
  10. return ans;
  11. }
  12. void dfs(vector<double> vec)
  13. {
  14. //cout<<endl;
  15. int n=vec.size();
  16. if(n==1)
  17. {
  18. if(vec[0]<=(24+eps)&&vec[0]>=(24-eps)) ans=1;
  19. return;
  20. }
  21. for(int i=0;i<n;i++)
  22. {
  23. for(int j=0;j<n;j++)
  24. {
  25. if(i==j) continue;
  26. double a=vec[i],b=vec[j];
  27. for(int k=0;k<4;k++)
  28. {
  29. if((k==0||k==2)&&j>i) continue;
  30. double tmp;
  31. bool flag=0;
  32. if(k==0)
  33. {
  34. tmp = (a+b);
  35. }
  36. else if(k==1)
  37. {
  38. tmp = (a-b);
  39. }
  40. else if(k==2)
  41. {
  42. tmp=a*b;
  43. }
  44. else
  45. {
  46. if(fabs(b)<eps)
  47. {
  48. flag=1;
  49. }
  50. else
  51. {
  52. tmp=(1.0*a)/b;
  53. }
  54. }
  55. vector<double> dl;
  56. for(int t=0;t<n;t++)
  57. {
  58. if(t==i||t==j) continue;
  59. dl.push_back(vec[t]);
  60. }
  61. if(flag==1) continue;
  62. dl.push_back(tmp);
  63. dfs(dl);
  64. }
  65. }
  66. }
  67. }
  68. };

发表评论

表情:
评论列表 (有 0 条评论,332人围观)

还没有评论,来说两句吧...

相关阅读

    相关 24游戏及其算法

    24点游戏及其算法 1.问题描述 24点是棋牌类益智游戏,要求结果等于二十四,一起来玩玩吧!这个游戏用扑克牌更容易来开展。拿一副牌,抽去大小王后(初练也可以把J/Q

    相关 24游戏

    一.问题   随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24就代表用户赢了此局

    相关 c++简单24游戏

    我的博客已经全部迁移到新地址,欢迎收藏我的[个人博客][Link 1]。 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++