当前位置:   article > 正文

蓝桥杯-24点游戏_蓝桥杯 24

蓝桥杯 24

问题描述

  24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24,例如:

  ((A*K)-J)*Q等价于((1*13)-11)*12=24

  加减乘不用多说了,但除法必须满足能整除才能除!这样有一些是得不到24点的,所以这里只要求求出不超过24的最大值。

输入格式

  输入第一行N(1<=N<=5)表示有N组测试数据。每组测试数据输入4行,每行一个整数(1到13)表示牌值。

输出格式

  每组测试数据输出一个整数,表示所能得到的最大的不超过24的值。

样例输入

3

3

3

3

3

1

1

1

1

12

5

13

1

样例输出

24

4

21

初步思路:

初步思路就是没有思路,根据网上大佬答案,找到大体的解决方法:与”粘木棍“逻辑相似,取任意两张牌,进行加减乘除四种情况的运算,得到新的牌取代参与运算的牌,不断搜索下去,直到数组长度为1,最后result中取最小的即可,同”粘木棍“,二维递归,且对nums[i]进行更改,乐了,这跟粘木棍一样一样的,直接照写,不出意外,0蛋:

  1. n=int(input())
  2. li1=[[]for _ in range(n)]
  3. result=[[] for i in range(n)]
  4. class Solution:
  5. def __init__(self):
  6. self.result=[]
  7. def solve(self,N,li):
  8. li.sort()
  9. self.flag=0
  10. self.backtracking(N,li)
  11. return self.result
  12. def backtracking(self,N,li):
  13. print(li,N)
  14. if self.flag==1:
  15. return
  16. if N==1:
  17. if li[0]>24:
  18. return
  19. elif li[0]==24:
  20. self.result=[24]
  21. self.flag=1
  22. return
  23. else:
  24. self.result.append(li[0])
  25. return
  26. for i in range(N):
  27. for j in range(i+1,N):
  28. a=li[i]
  29. b=li[j]
  30. li[i]=a+b
  31. li[j],li[N-1]=li[N-1],li[j]
  32. self.backtracking(N-1,li)
  33. #
  34. li[i]=a*b
  35. li[j],li[N-1]=li[N-1],li[j]
  36. self.backtracking(N-1,li)
  37. #
  38. li[i]=a-b
  39. li[j],li[N-1]=li[N-1],li[j]
  40. self.backtracking(N-1,li)
  41. #
  42. li[i]=b-a
  43. li[j],li[N-1]=li[N-1],li[j]
  44. self.backtracking(N-1,li)
  45. #
  46. if a!=0 and b%a==0:
  47. li[i]=b/a
  48. li[j],li[N-1]=li[N-1],li[j]
  49. self.backtracking(N-1,li)
  50. #
  51. if b!=0 and a%b==0:
  52. li[i]=a/b
  53. li[j],li[N-1]=li[N-1],li[j]
  54. self.backtracking(N-1,li)
  55. li[j],li[N-1]=li[N-1],li[j]
  56. li[i]=a
  57. for i in range(n):
  58. s=Solution()
  59. result=[]
  60. result=s.solve(4,li1[i])
  61. print(max(result))

进阶思路:

这里不同于”粘木棍“的是,本题为多重递归,因为有加减乘除4种情况,故不能采用”粘木棍“的”多于元素与末尾元素调换位置“的模式,因为回溯只有一次,多次递归迟早会搜索到被调换到末尾的无用元素,故这里采用nums[j]=nums[N-1]的方法,具体解释:

n数字,其中两个数字相处理后会导致

j位置的数字被更新而i位置的数字无效,

此时将最后一个数调到i位置

这样有效数字正好变成了前n-1个数字

比如1 2 3 4

计算1+2后

变成1 3 3 4

调整后变成4 3 3 4

有效数字3 3 4 就正好到了前三个位置,必须保证把有效的3个数字移到最前面。又或者换句话说最后一个数即nums[n-1]一定是有效的,但当有效数字的个数减少时,最后一个数就必须要提前,即赋值给i位置

然后轻松(个屁)AC:

  1. n=int(input())
  2. li1=[[]for _ in range(n)]
  3. result=[[] for i in range(n)]
  4. for i in range(n):
  5. for j in range(4):
  6. li1[i].append(int(input()))
  7. class Solution:
  8. def __init__(self):
  9. self.result=[]
  10. def solve(self,N,li):
  11. li.sort()
  12. self.flag=0
  13. self.backtracking(N,li)
  14. return self.result
  15. def backtracking(self,N,li):
  16. if self.flag==1:
  17. return
  18. if N==1:
  19. if li[0]>24:
  20. return
  21. elif li[0]==24:
  22. self.result=[24]
  23. self.flag=1
  24. return
  25. else:
  26. self.result.append(li[0])
  27. return
  28. for i in range(N):
  29. for j in range(i+1,N):
  30. a=li[i]
  31. b=li[j]
  32. li[i]=a+b
  33. li[j]=li[N-1]
  34. self.backtracking(N-1,li)
  35. #
  36. li[i]=a*b
  37. li[j]=li[N-1]
  38. self.backtracking(N-1,li)
  39. #
  40. li[i]=a-b
  41. li[j]=li[N-1]
  42. self.backtracking(N-1,li)
  43. #
  44. li[i]=b-a
  45. li[j]=li[N-1]
  46. self.backtracking(N-1,li)
  47. #
  48. if a!=0 and b%a==0:
  49. li[i]=b/a
  50. li[j]=li[N-1]
  51. self.backtracking(N-1,li)
  52. #
  53. if b!=0 and a%b==0:
  54. li[i]=a/b
  55. li[j]=li[N-1]
  56. self.backtracking(N-1,li)
  57. li[i]=a
  58. li[j]=b
  59. for i in range(n):
  60. s=Solution()
  61. result=[]
  62. result=s.solve(4,li1[i])
  63. print(max(result))

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/64330
推荐阅读
相关标签
  

闽ICP备14008679号