[关闭]
@yexiaoqi 2022-05-20T08:38:02.000000Z 字数 1381 阅读 267

HJ67. 24点游戏算法

刷题


题目:给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

输入描述:读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。
输出描述:对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false
示例

输入:7 2 1 10
输出:true

链接https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb


  1. public class HJ67_24点游戏算法 {
  2. public static void main(String[] args){
  3. Scanner sc=new Scanner(System.in);
  4. while(sc.hasNext()){
  5. double[] nums=new double[4];
  6. for(int i=0; i<nums.length; i++){
  7. nums[i]=(sc.nextDouble());
  8. }
  9. System.out.println(dfs(nums));
  10. }
  11. }
  12. public static boolean dfs(double[] nums){
  13. if(nums.length==1) {//处理计算精度问题
  14. return Math.abs(nums[0]-24) <= 1e-6;
  15. }
  16. //任意取两个不同的数,运算出第三个数,进行后续计算
  17. for(int i=0; i<nums.length; i++){
  18. for(int j=i+1; j<nums.length; j++){
  19. //存放运算结果及剩余元素
  20. double[] newNums=new double[nums.length-1];
  21. for (int k=0,index=0; k<nums.length; k++){
  22. if (k!=i && k!=j) {
  23. newNums[index++]=nums[k];
  24. }
  25. }
  26. //尝试加法
  27. newNums[newNums.length-1] = nums[i]+nums[j];
  28. if (dfs(newNums)) return true;
  29. //减法
  30. newNums[newNums.length-1] = nums[i]-nums[j];
  31. if (dfs(newNums)) return true;
  32. newNums[newNums.length-1] = nums[j]-nums[i];
  33. if (dfs(newNums)) return true;
  34. //乘法
  35. newNums[newNums.length-1] = nums[i]*nums[j];
  36. if (dfs(newNums)) return true;
  37. //除法,除数不能为0
  38. if (nums[i] != 0){
  39. newNums[newNums.length-1] = nums[j]/nums[i];
  40. if (dfs(newNums)) return true;
  41. }
  42. if (nums[j] != 0){
  43. newNums[newNums.length-1] = nums[i]/nums[j];
  44. if (dfs(newNums)) return true;
  45. }
  46. }
  47. }
  48. return false;
  49. }
  50. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注