iPad游戏 Calcculator: The Game 程序自动计算求解方法
今天在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实现的。
package com; import com.google.common.collect.Lists; import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List; /**
* 2018-08-24 下午10:36.
*
*/
public class Calc {
public static void main(String[] args) {
int n = 5;
int start = 0;
int target = 210;
List<Num> list = Lists.newArrayList();
list.add(new Num(OpType.SET, 2));
list.add(new Num(OpType.SET, 5));
// list.add(new Num(OpType.LEFT_SHIFT, 0));
list.add(new Num(OpType.ADD, 5));
list.add(new Num(OpType.SUB, 5));
// list.add(new Num(OpType.SET, 0));
// list.add(new Num(OpType.SET, 5));
dfs(list, new ArrayDeque<>(), n, start, target);
} static void dfs(List<Num> list, Deque<Num> res, int step, int last, int target) {
if (list == null || list.size() == 0 || step <= 0) {
return;
}
for (int i = 0; i < list.size(); i++) {
Num num = list.get(i);
int tmp = num.calc(last);
if (tmp == 0xdeadbeef) {
continue;
}
res.offer(num);
if (tmp == target) {
System.out.println(res);
} else {
dfs(list, res, step - 1, tmp, target);
}
res.pollLast();
}
} static class Num {
OpType opType;
int num; protected Num(OpType opType, int num) {
this.opType = opType;
this.num = num;
} public int calc(int last) {
if (this.opType == OpType.SET) {
if (last == 0) {
return this.num;
} else {
return last * (int)Math.pow(10, this.num / 10 + 1) + this.num;
}
}
if (this.opType == OpType.LEFT_SHIFT) {
return last / 10;
}
if (this.opType == OpType.ADD) {
return this.num + last;
}
if (this.opType == OpType.SUB) {
return last - this.num;
}
if (this.opType == OpType.MUL) {
return last * this.num;
} else {
if (last % this.num == 0) {
return last / this.num;
} else {
return 0xdeadbeef;
}
}
} @Override
public String toString() {
return "Num{" +
"opType=" + opType +
", num=" + num +
'}';
}
} enum OpType {
SET, ADD, SUB, MUL, DIV, LEFT_SHIFT;
}
}
上面那道题代码输出就是:
[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 程序自动计算求解方法的更多相关文章
- 用CSS画小猪佩奇,你就是下一个社会人! js将“I am a coder”反转成 “coder a am I”,不许用split,join,subString,reverse;求解方法三
用CSS画小猪佩奇,你就是下一个社会人! 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯 ...
- ASP程序加密/解密方法大揭密
如今,用ASP技术构建的网站随处可见.由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的 ...
- ASP.NET网站中获取当前虚拟目录的应用程序目录的方法(转)
[原创]ASP.NET网站中获取当前虚拟目录的应用程序目录的方法 ASP.NET网站中获取当前虚拟目录的应用程序目录的方法1.问题描述:有时候,某个网页控件会被不同目录下文件使用,此时如果该控件中有一 ...
- JAVA文件中获取路径及WEB应用程序获取路径方法
JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...
- 定位程序问题的方法 -- clwu
原本的标题的<定位程序代码的方法>,但问题有时候超出了自己代码的范围,而是别人的程序,所以今天想分享的是一个通用的分析问题(程序)的思路. 先来说一下在使用别人的程序(Vim)过程中遇到问 ...
- [转] python程序的调试方法
qi09 原文 python程序的调试方法 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 源码例子 例如,有模拟税收计算的程序: #!/usr/bin/python de ...
- 用JQuery中的Ajax方法获取web service等后台程序中的方法
用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...
- 微信小程序数据请求方法wx.request小测试
微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </vi ...
- 三种计算c#程序运行时间的方法
三种计算c#程序运行时间的方法 第一种: 利用 System.DateTime.Now // example1: System.DateTime.Now method DateTime dt1 = S ...
随机推荐
- java多线程 栅栏CyclicBarrier
CyclicBarrier类介绍A synchronization aid that allows a set of threads to all wait for each other to rea ...
- gitee 搭建自己的代码仓库
git是什么? 还是科普一下吧:Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理(来自我大百度) 现在越来越多的公司已经使用git来进行项目的版本管理,,使用起来 ...
- Unity GetComponents获取组件
Component[] componments2 = gameObject.GetComponents<Component>(); Debug.Log("componments2 ...
- git使用笔记-比较分支差异
比如我们有 2 个分支:master, dev,现在想查看这两个 branch 的区别,有以下几种方式: 1.查看 dev 有,而 master 中没有的: git log dev ^master 同 ...
- Unicode汉字编码表以及参考源码分享
1 Unicode编码表 Unicode只有一个字符集,中.日.韩的三种文字占用了Unicode中0x3000到0x9FFF的部分 Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个 ...
- React.js 小书 Lesson2 - 前端组件化(一):从一个简单的例子讲起
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson2 转载请注明出处,保留原文链接和作者信息. 很多课程一上来就给大家如何配置环境.怎么写 Re ...
- 应该知道的一些Markdown语法
目录 快速输入标题 斜体和粗体,删除线 分隔线 外链接 无序列表 有序列表 定义型列表 插入图片 文字引用 标签分类 表格 行内代码块 代码段 注脚 待办事宜 Todo 列表 显示当前文章的目录 快速 ...
- python面试题——爬虫相关
1.接触过几种爬虫模块 urllib.requests这两种爬虫模块. 2.robots协议是什么? 它就是一个防君子不防小人的协议,网站有一些数据不想被爬虫程序爬取,可以编写robots协议文件,明 ...
- Native Method
While a 100% pure Java solution is nice in principle, realistically, for an application, there are s ...
- Cocos2d-x v3.1项目创建(三)
Cocos2d-x v3.1项目创建(三) Cocos2d-x官方为我们提供了用于创建.编译.运行和部署的一套命令行的工具集,也就是上篇文章中我们所提到的Cocos2d-Console,它位于我们的引 ...