今天在iPad上下了个小游戏,主要是一个计算器的界面,有开始值,目标值,限定步数,以及一些加减乘除,还有作者脑洞想出来的功能键,主要有左移,直接把一个数加到末尾,将其中的某个数改为另一个数等等。。玩到20几关的时候感觉每道题要想一会儿才能解出来,于是有了下面的程序,写完程序就不想玩了。

游戏界面如下,就像一个真的计算器。其中紫色的2、5分别表示在当前数字最后插入2、5,+5和-5就是加减,初始值是0,限定5步,得到目标值210,想想该怎么操作?是不是不是太容易一眼看出来?这就对了,这么容易让你看出来作者怎么赚钱?

答案是:SET 2==>2, SET 5==>25, SUB 5 ==> 20, SET 5 ==>205, ADD 5 ==> 210

代码如下,用回溯的思想,DFS实现的。

  1. package com;
  2.  
  3. import com.google.common.collect.Lists;
  4.  
  5. import java.util.ArrayDeque;
  6. import java.util.Deque;
  7. import java.util.List;
  8.  
  9. /**
  10. * 2018-08-24 下午10:36.
  11. *
  12. */
  13. public class Calc {
  14. public static void main(String[] args) {
  15. int n = 5;
  16. int start = 0;
  17. int target = 210;
  18. List<Num> list = Lists.newArrayList();
  19. list.add(new Num(OpType.SET, 2));
  20. list.add(new Num(OpType.SET, 5));
  21. // list.add(new Num(OpType.LEFT_SHIFT, 0));
  22. list.add(new Num(OpType.ADD, 5));
  23. list.add(new Num(OpType.SUB, 5));
  24. // list.add(new Num(OpType.SET, 0));
  25. // list.add(new Num(OpType.SET, 5));
  26. dfs(list, new ArrayDeque<>(), n, start, target);
  27. }
  28.  
  29. static void dfs(List<Num> list, Deque<Num> res, int step, int last, int target) {
  30. if (list == null || list.size() == 0 || step <= 0) {
  31. return;
  32. }
  33. for (int i = 0; i < list.size(); i++) {
  34. Num num = list.get(i);
  35. int tmp = num.calc(last);
  36. if (tmp == 0xdeadbeef) {
  37. continue;
  38. }
  39. res.offer(num);
  40. if (tmp == target) {
  41. System.out.println(res);
  42. } else {
  43. dfs(list, res, step - 1, tmp, target);
  44. }
  45. res.pollLast();
  46. }
  47. }
  48.  
  49. static class Num {
  50. OpType opType;
  51. int num;
  52.  
  53. protected Num(OpType opType, int num) {
  54. this.opType = opType;
  55. this.num = num;
  56. }
  57.  
  58. public int calc(int last) {
  59. if (this.opType == OpType.SET) {
  60. if (last == 0) {
  61. return this.num;
  62. } else {
  63. return last * (int)Math.pow(10, this.num / 10 + 1) + this.num;
  64. }
  65. }
  66. if (this.opType == OpType.LEFT_SHIFT) {
  67. return last / 10;
  68. }
  69. if (this.opType == OpType.ADD) {
  70. return this.num + last;
  71. }
  72. if (this.opType == OpType.SUB) {
  73. return last - this.num;
  74. }
  75. if (this.opType == OpType.MUL) {
  76. return last * this.num;
  77. } else {
  78. if (last % this.num == 0) {
  79. return last / this.num;
  80. } else {
  81. return 0xdeadbeef;
  82. }
  83. }
  84. }
  85.  
  86. @Override
  87. public String toString() {
  88. return "Num{" +
  89. "opType=" + opType +
  90. ", num=" + num +
  91. '}';
  92. }
  93. }
  94.  
  95. enum OpType {
  96. SET, ADD, SUB, MUL, DIV, LEFT_SHIFT;
  97. }
  98. }

上面那道题代码输出就是:

[Num{opType=SET, num=2}, Num{opType=SET, num=5}, Num{opType=SUB, num=5}, Num{opType=SET, num=5}, Num{opType=ADD, num=5}]

根据输出操作即可。

目前定义了几个基本操作,当然估计这游戏后面估计还有其他的神奇操作,我没有继续往后玩了就写到这里了。

iPad游戏 Calcculator: The Game 程序自动计算求解方法的更多相关文章

  1. 用CSS画小猪佩奇,你就是下一个社会人! js将“I am a coder”反转成 “coder a am I”,不许用split,join,subString,reverse;求解方法三

    用CSS画小猪佩奇,你就是下一个社会人!   欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯 ...

  2. ASP程序加密/解密方法大揭密

      如今,用ASP技术构建的网站随处可见.由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的 ...

  3. ASP.NET网站中获取当前虚拟目录的应用程序目录的方法(转)

    [原创]ASP.NET网站中获取当前虚拟目录的应用程序目录的方法 ASP.NET网站中获取当前虚拟目录的应用程序目录的方法1.问题描述:有时候,某个网页控件会被不同目录下文件使用,此时如果该控件中有一 ...

  4. JAVA文件中获取路径及WEB应用程序获取路径方法

    JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...

  5. 定位程序问题的方法 -- clwu

    原本的标题的<定位程序代码的方法>,但问题有时候超出了自己代码的范围,而是别人的程序,所以今天想分享的是一个通用的分析问题(程序)的思路. 先来说一下在使用别人的程序(Vim)过程中遇到问 ...

  6. [转] python程序的调试方法

    qi09 原文 python程序的调试方法 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 源码例子 例如,有模拟税收计算的程序: #!/usr/bin/python de ...

  7. 用JQuery中的Ajax方法获取web service等后台程序中的方法

    用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...

  8. 微信小程序数据请求方法wx.request小测试

    微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </vi ...

  9. 三种计算c#程序运行时间的方法

    三种计算c#程序运行时间的方法 第一种: 利用 System.DateTime.Now // example1: System.DateTime.Now method DateTime dt1 = S ...

随机推荐

  1. 为啥Spring和Spring MVC包扫描要分开?

    背景:       最近在搭建新工程的时候发现有些Spring的配置不是很了解,比如Spring 配置里面明明配置了component-scan,为啥Spring MVC配置文件还需要配置一下,这样岂 ...

  2. 聊一聊IAR的workspace文件组织

    抽空偶尔做个zigbee实验其实也挺好玩的,今天我就来总结一下嵌入式IAR Embedded Workbench这个非常有效的集成开发环境的文件组织. 每一个workspace由一般是由.c文件和一个 ...

  3. Beam内置的数据源清单(Java、Python)

    不多说,直接上干货! Beam内置的Java数据源清单: Beam内置的Python数据源清单:  

  4. [Eclipse]自动注释功能

    1) 新建一个file时,加上一些注释的方法. window->preference->java->code     styple->code     template 当你选 ...

  5. [转]c#匿名类

    首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { ...

  6. 如何修改eclipse的web项目默认浏览器

  7. ACM-单调队列

    对于单调队列的基本概念可以去看百科里的相关介绍:http://baike.baidu.com/view/3771451.htm 这里挑一些重点. 作用: 不断地向缓存数组里读入元素,也不时地去掉最老的 ...

  8. 《Head First 设计模式》总结

    复合模式——模式的模式 MVC(模型-视图-控制器):是由数个设计模式结合起来的模式. 戴着模式的有色眼镜看MVC: 模型利用观察者模式让控制器和视图可以随最新的状态改变而更新. 模型对视图和控制器一 ...

  9. .net函数

    Math.Ceiling() Math.Floor() == 向上取整,向下取整 Regex.Split(productListControl.Text, "\n", RegexO ...

  10. 安全漏洞 : XSS CSRF

    https://my.oschina.net/hc24/blog/527099 XSS成因概括 : XSS其实就是Html的注入问题,攻击者A的输入没有经过严格的控制进入了数据库,最终显示给来访的用户 ...