植物大战僵尸

以前很用心的玩过一段时间植物大战僵尸,用win7玩的。

点亮了所有植物

无限生存模式也玩到了不错的成绩

智慧树养到了很高的程度,然而她一直不说有意思的话了。。。

种植物基本上都是上下对称的。

我还专门收集过单色的金盏花,但是这很难。

就是拼命买种子,然后如果颜色不对的,就把它卖掉。

首先,这样肯定要亏很多钱的,得有足够的钱,这个我有。

然后,金盏花的颜色有很多种。

点击打开链接这个链接里面有讨论,都说有11种,我不太记得了,好像差不多应该就是11左右。

如果是11种的话,要碰到需要的颜色可不容易。

最要命的是2个时间问题。

一方面,金盏花的种子不能连续的买。

在商店里面,只有3个种子在独立地卖,对于每个种子,玩家买了之后,必须等一段时间之后才能买。

我不记得是多久了,好像是几个小时,反正时间不短。

另一方面,种子浇水之后需要一定的时间才能发芽,然后才能看到颜色。

而且,金盏花还有2种方向!

然而机智的我还是凑齐了2套:

上面的全部是1种紫色花,下面的是2种白色花,都是face to face的方向。

这主要归功于,我发现植物大战僵尸是不联网的游戏。

不联网的游戏怎么获取时间呢?很明显,只能是获取系统当前时间。

于是我写了2个bat:

第一个,买种子.bat

@date 2015/1/4
@ping 127.0.0.1 -n 3
@date 2015/1/5
@ping 127.0.0.1 -n 3
@date 2015/1/6
@ping 127.0.0.1 -n 3
@date 2015/1/7
@ping 127.0.0.1 -n 3
@date 2015/1/8
@ping 127.0.0.1 -n 3
@date 2015/1/9 
@ping 127.0.0.1 -n 3
@date 2015/1/10
@ping 127.0.0.1 -n 3

第二个,修改时间.bat

:n
@date 2015/1/1 
@ping 127.0.0.1 -n 2
@date 2015/1/2
@ping 127.0.0.1 -n 2
goto :n

这2个bat的作用是不一样的,一个是买种子,一个是让种子发芽。

总之,有了这2个bat之后,就可以轻松无限买种子了,只要你有钱,简直是外挂。

对于win10,只要右键bat文件,点击“以管理员身份运行”即可,普通的双击运行是没有效果的。

在破除了时间限制的条件下,我们来讨论一下,如何集齐32朵紫色金盏花?

首先是方向问题,到底应该集单向的还是face to face的呢?

这个不应该一开始就决定,应该先不管方向,先收集一些紫色花,然后看看她们的颜色如何。

即使打定了主意要集单向的,也应该这么做,看哪个方向的比较多就继续集哪个方向的。

后来发现,两个方向的数量非常接近。

这样的话,且不说已有的基础,哪怕是从头开始集,集face to face的绝对比集单向的要容易很多。

因为两个方向的概率应该是一样的我感觉,所以集face to face的其实差不多就相当于是不管方向,只要颜色对就行。

这样,最后只需要按照颜色一排就是的了。

当然了,集face to face的肯定是比不管方向的要难一些,不过差别确实不大。

然后再考虑这样一个问题:金盏花有11种颜色,如果不管方向,如何集齐32朵紫色的?

每次买3个种子,不是紫色的就卖掉,然后进入下一轮循环。。。

每一轮都有这些操作:

(1)运行买种子.bat,同时买种子

(2)浇水

(3)运行修改时间.bat,运行结束之后种子就发芽了

(4)如果是不需要的,就直接卖掉

到了集齐31朵的时候,如果每次只买一个种子的话,这样还是比较麻烦,所以,我们需要借助水生植物园。

事实上,当集齐30朵的时候,我们就需要借助水生植物园了。

这样,就可以每一轮都买3个种子了。

最后考虑,大约需要多少轮(每轮购买3个种子)才能集齐32朵紫色的?

这是一个动态规划问题,类似于找bug问题:​概率与期望 POJ 2096 Collecting Bugs​

这个问题抽象出来就是:

f[0]=0,f[1]=0,f[2]=0

f[n]=(f[n-1]*300+f[n-2]*30+f[n-3]+1331)/331.0

而f[34]就是答案,这样就很简单了。

代码:

#include<iostream>
using namespace std;

int main()
{
	double f[35];
	f[0] = 0, f[1] = 0, f[2] = 0;
	for (int n = 3; n <= 34; n++)
	    f[n] = (f[n - 1] * 300 + f[n - 2] * 30 + f[n - 3] + 1331) / 331;
	cout << f[34];
	return 0;
}


 

答案是117.667,约为118,也就是说大约要118轮才能集齐32朵紫色的。

不要误会,我打断点看了更精确的结果,答案并不是353/3.0

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值