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 ...
随机推荐
- Robot Framework 的安装和配置
Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...
- ckeditor(在线文本编辑器)使用教程
ckeditor是一款由javascript编写的富文本网页编辑器,它可以填写文字.插入图片.视频.Excel等富媒体信息,也可以在源码方式下填写内容,在各个网站中应用非常广泛. 下面就来说说cked ...
- Mysql 游标的定义与使用方式
创建游标: 首先在MySql中创建一张数据表: CREATE TABLE IF NOT EXISTS `store` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...
- Erlang C 與M/M/N排隊模型
一何谓排队模型 在现实生活中排队的现象可说是无处不在,如:买票.超商.百货公司…等.顾客总是在揣测"排在哪一个服务台会比较快?"或"到底还要排多久呢?"类似这样 ...
- 移动Web开发与适配笔记
项目要是适配手机端,想透彻的把相关内容弄清楚,现在总结一下. 一.移动端开发有如下特点: 1.跑在手机端的web 页面就是h5页面 2.具有跨平台性(web 安卓 iOS都适应) 3.基于webvie ...
- 前端性能优化-keep-alive
什么是Keep-Alive Keep-Alive是浏览器端和服务器端约定的一种提高传输效率的协议.我先举个例子吧,我现在搬家,有10个箱子,如果我自己来搬的话,每次只能带一个箱子,那么搬到目的地,需要 ...
- 从零开始的全栈工程师——js篇2.19(BOM)
一.BOM 浏览器对象模型 1.window.open(url,ways) url 是打开的网页地址ways 打开的方式 _self 2.window.close() 关闭当前页面 3.window. ...
- 关于jqeury中attr()和prop()方法
在平时工作中老会被一样的问题困住,浪费时间,这里做一个简要笔记. 在使用jquery给元素设置属性的时候,如果是一般的div,p等正常元素设置属性的话,使用attr()足以,但是在给拥有checked ...
- Wallet address
BCX XZVYYwXFAJwv6x4KTssQxJb4EReVdCBnpb BCD 1DNSFUD7LURZdmbckkQcxMvinNJ26mVcNH
- Use Exception.ToString() instead of Exception.Message.
Exception.Message contains only the message (doh) associated with the exception. Example: Object ref ...