谁能取到最后一枚硬币手机解锁魔术谁就获胜,问谁又取胜的策略

星期天,我和妈妈玩了一个取球的游戏。游戏规则是:一个木盒里有101个塑料球,我和妈妈轮流从中取球,但每人每次只能从中取走1个或2个球,不许不取球,谁能先取得木盒中的最后一个球,她就赢了。
  游戏开始了,妈妈客气地对我说:“你小,还是你先取球吧!”我低头沉思:怎样才能保证自己取胜呢?由于每人每次可取1个球或者2个球,当我取1个球的时候,妈妈最多可以取2个球;反过来,当妈妈取1个球时,我最多可取2个球。因此,可以把3个球作为一组,这时,看101个球中有多少组就可以啦:101?鳎?+2)=33(组)……2(个)。哈哈,我计上心来。于是,我先取了2个球,接下来,妈妈取1个,我取2个;她取2个,我取1个,我和妈妈取球的个数和是3。“我赢定啦!”我美滋滋地说。“不一定哦!”妈妈不甘心落后。就这样我们每次取球的个数和都是3。   取到最后,哈哈!我赢了!我开心极了。“你真聪明!”妈妈佩服地说,“真棒!”我告诉了妈妈取胜的策略,妈妈开心地笑了。   看来只要留心观察,善于动脑,就会有所发现,有所收获。生活中处处有学问,玩游戏也有取胜的策略哦!百度搜索“就爱阅读”,专业资料、生活学习,尽在就爱阅读网92to.com,您的在线图书馆!
欢迎转载:
推荐:    扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
有棋子101枚.两人轮流取棋子每人每次至少取走一枚,最多取走走3枚,直到把棋子取完,谁取到最后一枚棋子,谁就获胜.假如你参加这个游戏,你有取胜的策略吗?你取胜的策略是什么?
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
找规律 还剩1个谁拿谁输 还剩5个谁拿谁输 还剩9个谁拿谁输(他1你3.他2你2,他3你1,变成5个) 注意每个都差4个,所以1+4N谁拿谁输掉 所以101谁先拿谁输,只要每次他1你3.他2你2,他3你1)所以赢得办法就是后拿喽~满意勿忘采纳,谢谢支持希望对您有所帮助!以上内容纯手工敲打^_^若没有问题请及时选为【满意答案】如有不详之处可以继续向我【追问】————————来自【忧乐美!】团队只为莫悠的回答!
为您推荐:
其他类似问题
扫描下载二维码在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
点击阅读原文
一道腾讯面试题的思考:到底谁会赢?
日 发布,来源:
最近看到一道腾讯面试题,觉得很有意思。题干如下:
有甲乙两家伙用一个英语单词玩游戏(无聊的人还是很多的!!!)。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a & b & c &….&z,假设单词字母不区分大小写,也就是说,a与A算相等),则这个人胜利。假设两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么?
输入: 一连串英文小写字母,长度任意(当然要在计算机能承受的范围内),保证最开始的状态不是一个严格单增的序列。
输出:1表示甲可以赢,0表示甲不能赢。
例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。
又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。
下面给出我用Java实现的算法,如果大家有其他的实现方法,欢迎跟帖和探讨。语言不限。
我的基本实现思路将给定的单词分成若干个单调递增的序列。然后按每个序列中包含单词个数多少进行递减排序,也就是说,排在前面的单调递增序列中包含的字母个数最少。然后由甲开始从排在前面的递增序列中选择一个字母。直到该递增序列中的字母全部被选中。然后继续从下一个递增序列选择字母。按着这样的方法做,直到剩下最后一个单调递增序列,随最后选择了倒数第二个单调递增序列中的最后一个字母,谁就赢了。
例如,单词hela,可以分为三个单调递增序列:h、a、el。从甲开始选择。
由于a是倒数第二个单调递增序列的最后一个字母,所以乙赢了。
对于单词money可以分成三个单调递增序列:mo、n、ey。排序后:n、mo、ey。
所以甲赢。
具体的实现算法如下:
public class Test
实现算法的方法,in为一个给定的单词
public static int who(String in)
基本思路就是找到该单词中所有递增的子序列,然后从字符最少的子序列甲乙轮回删除字母,直到还剩下最后一个子序列为止
谁删除了最后一个字母,谁就赢了!
in不能为null
if(in == null)
单词至少需要有一个字母
if(in.length() == 0)
in = in.toLowerCase();
都变成小写字母
所有递增数列集合
java.util.List<StringBuilder> ascendingList = new java.util.ArrayList<StringBuilder>();
char lastChar = in.charAt(0);
StringBuilder sb = new StringBuilder();
// 存储当前递增的字符列表
sb.append(lastChar);
for(int i = 1; i < in.length(); i++)
当前字符属于当前的递增序列
if(in.charAt(i) > lastChar)
sb.append(in.charAt(i));
当前字符属于下一个递增序列,所以需要存储上一个递增序列
ascendingList.add(sb);
sb = new StringBuilder();
sb.append(in.charAt(i));
lastChar = in.charAt(i);
if(sb.length() > 0)
ascendingList.add(sb);
下面就开始游戏了
从甲开始删字母,从字符最少的递增序列开始删除第一个字母,直到之后只剩下一个递增序列为止,谁删除的最后一个之母,谁就赢了
这里本应该判断如果单词本身就是递增序列,那么甲就win了,不过既然题目说没有这种情况,所以就注释掉了
/*if(ascendingList.size() == 1)
java.util.Collections.sort(ascendingList, new java.util.Comparator<StringBuilder>()
public int compare(StringBuilder sb1, StringBuilder sb2)
if(sb1.length() > sb2.length())
else if(sb1.length() == sb2.length())
return -1;
int win = 0;
1代表甲赢,0代表乙赢
while(ascendingList.size() > 1)
if(win == 0)
删除第一个递增序列的第一个字母,如果该递增序列
ascendingList.get(0).delete(0, 1);
if(ascendingList.get(0).length() == 0)
ascendingList.remove(0);
return win;
public static void main(String[] args)
System.out.println(who("money"));
引用&&&&对于单词money可以分成三个单调递增序列:mo、n、ey。排序后:n、mo、ey。甲:n乙:m甲:o所以甲赢。
甲选完n后乙直接选e呢?两人不是都足够聪明么?
引用&&&&对于单词money可以分成三个单调递增序列:mo、n、ey。排序后:n、mo、ey。
所以甲赢。
甲选完n后乙直接选e呢?两人不是都足够聪明么?
那请问,我可不可以这么想,我每次的到数列,就判断我能不能一次取胜,如果不能,我就取一个数,这个数保证下一个人不能取胜,一直轮回,知道数组长度为1
那请问,我可不可以这么想,我每次的到数列,就判断我能不能一次取胜,如果不能,我就取一个数,这个数保证下一个人不能取胜,一直轮回,知道数组长度为1
我也赞同这个想法!
@alex_mercer 我也赞同这个想法!
可以使用递归做啊,而且更好理解。当某玩家拿到单词时,如果已经是严格递增的说明他输,如果不是,考虑在这个单词基础上取每个字母的情况,递归调用函数得到该情况下对手是否必赢,所有情况里只要有一个对手不是必赢,那我就是必赢了。
function mustWin(arr) {
var haveLost =
for (var i = 0; i & arr.length - 2; i++) {
if (arr[i] &= arr[i + 1]) {
haveLost =
if (haveLost) {
for (var i = 0; i & arr.length - 1; i++) {
var copy = arr.concat();
copy.splice(i,1);
var opponentMustWin = mustWin(copy);
if (opponentMustWin) {
function f(str) {
var strUpper = str.toUpperCase();
var asciiList = [
for (var i = 0; i & strUpper. i++) {
asciiList.push(strUpper.charCodeAt(i));
console.log(mustWin(asciiList));
可以使用递归做啊,而且更好理解。当某玩家拿到单词时,如果已经是严格递增的说明他输,如果不是,考虑在这个单词基础上取每个字母的情况,递归调用函数得到该情况下对手是否必赢,所有情况里只要有一个对手不是必赢,那我就是必赢了。
```javascript
function mustWin(arr) {
var haveLost =
for (var i = 0; i & arr.length - 2; i++) {
if (arr[i] &= arr[i + 1]) {
haveLost =
if (haveLost) {
for (var i = 0; i & arr.length - 1; i++) {
var copy = arr.concat();
copy.splice(i,1);
var opponentMustWin = mustWin(copy);
if (opponentMustWin) {
function f(str) {
var strUpper = str.toUpperCase();
var asciiList = [
for (var i = 0; i & strUpper. i++) {
asciiList.push(strUpper.charCodeAt(i));
console.log(mustWin(asciiList));
1、考虑一步取胜的
2、考虑任意两步不会取胜的
在一定会走第二步的情况,若是再进一步考虑,怕是要每次分析最长至最短顺序字符串,需要剔除的个数,往大概率单数方向靠拢
1、考虑一步取胜的
2、考虑任意两步不会取胜的
在一定会走第二步的情况,若是再进一步考虑,怕是要每次分析最长至最短顺序字符串,需要剔除的个数,往大概率单数方向靠拢
有程序员高手的联系我
有程序员高手的联系我
我觉得楼主的分析有错。起码的hela,甲为什么要拿“h”呢?肯定拿“l”啊。楼主忽略了题目中说得“俩人都是聪明人”,聪明人会走废棋的。还有,肯定不是递归,计算量太大了。我感觉应该是图论,讨论啊……
我觉得楼主的分析有错。起码的hela,甲为什么要拿“h”呢?肯定拿“l”啊。楼主忽略了题目中说得“俩人都是聪明人”,聪明人会走废棋的。还有,肯定不是递归,计算量太大了。我感觉应该是图论,讨论啊……
游戏中永远存在先手优势,先手永远有绝对能胜利的策略
游戏中永远存在先手优势,先手永远有绝对能胜利的策略
1332A删1 剩332
删3平A删2 剩133
B删3 胜A删3 剩132
A最好的结果是平
A删1 剩332
A删2 剩133
A删3 剩132
A最好的结果是平
是否 存在一个序列,A删除任意数字 掉之后,B 有必胜策略
是否 存在一个序列,A删除任意数字 掉之后,B 有必胜策略
然后随便找几个试试, 12333 这样的序列的话,A如果 删除3,则必输,A一定不会这么选,A会选择删除1或者2
A删除1,剩下2333 ,B删除2,剩下333,平手
B删除3,剩下233,A胜
综上A删除1, B一定删除2,平手
A删除2,剩下1333, 同理综上A删除2,B一定删除1,平手
B删除3,剩下233,A胜
A考虑完删除 123的所有情况,一定会在1,2里面随机删除一个。 结局是平手
然后随便找几个试试, 12333 这样的序列的话,A如果 删除3,则必输,A一定不会这么选,A会选择删除1或者2
A删除1,剩下2333 ,B删除2,剩下333,平手
B删除3,剩下233,A胜
综上A删除1, B一定删除2,平手
A删除2,剩下1333, 同理综上A删除2,B一定删除1,平手
B删除3,剩下233,A胜
A考虑完删除 123的所有情况,一定会在1,2里面随机删除一个。 结局是平手
首先,一旦剩下的 全是 同一个数字
序列, 就是
首先,一旦剩下的 全是 同一个数字
序列, 就是
不要拿abcd了,看着也不直观, 简化成一个随机 数字序列好了 就当成是 10个字母abcde fghij
然后随机一个 序列。这里面忽略掉 英文单词这个题设,在随机序列里进行选择。如果有的选单词,那肯定是甲,那就没有意思了对不对。所以题目简化一下:AB两人轮流从一个随机数字序列(lenth&2,少了没有意义,是定义上的问题)中删除 任意数字,如果剩下的数字序列 严格单调递增,则这个人胜利。
问,A先开始,有必胜策略吗,如果有,在什么情况下有。可以是 递进 形式的 回答。
首先是 定义一种情况
,11,111,这些都不应该算是 严格单调递增的序列,剩下1个1 也就无所谓单调递增了,应该是 平局的,因为删除剩下一个,此时没有单调递增的 序列了。 当然,这个定义不同,导致后续的结果也会不一样,我建议按照这个定义讨论下去, 就是 剩下一个 字母 算平局,无人胜利。
不要拿abcd了,看着也不直观, 简化成一个随机 数字序列好了 就当成是 10个字母abcde fghij
然后随机一个 序列。
这里面忽略掉 英文单词这个题设,在随机序列里进行选择。如果有的选单词,那肯定是甲,那就没有意思了对不对。所以题目简化一下:
AB两人轮流从一个随机数字序列(lenth&2,少了没有意义,是定义上的问题)中删除 任意数字,如果剩下的数字序列 严格单调递增,则这个人胜利。
问,A先开始,有必胜策略吗,如果有,在什么情况下有。
可以是 递进 形式的 回答。
首先是 定义一种情况
,11,111,这些都不应该算是 严格单调递增的序列,剩下1个1 也就无所谓单调递增了,应该是 平局的,因为删除剩下一个,此时没有单调递增的 序列了。 当然,这个定义不同,导致后续的结果也会不一样,我建议按照这个定义讨论下去, 就是 剩下一个 字母 算平局,无人胜利。
不连续递增子序列(以adbcdefg为例,A拿掉d即胜利,不连续递增子序列abcdefg)双方制胜行动初步策略:找一个不连续递增子序列,使得自己拿掉一个元素之后除去自己拿掉的那个元素(
注意这个元素可以是自己选择的不连续递增子序列之中的元素
)和自己选的不连续递增子序列之外剩余的元素为偶数。
比如:knee A递增子序列选取kn的话,结局剩余2个e,平局;A选e,B拿E,A输,这局A如果不想输,那么肯定拿k/n,这样就是平局。
这样,循环下去的话,会导致最后剩下的应该是aAaaaaaAAAA这种字符串,然后A,B互取,看个数定输赢。先想这么个答案占坑。
不连续递增子序列(以adbcdefg为例,A拿掉d即胜利,不连续递增子序列abcdefg)
双方制胜行动初步策略:
找一个不连续递增子序列,使得自己拿掉一个元素之后除去自己拿掉的那个元素(
注意这个元素可以是自己选择的不连续递增子序列之中的元素
)和自己选的不连续递增子序列之外剩余的元素为偶数。
比如:knee A递增子序列选取kn的话,结局剩余2个e,平局;A选e,B拿E,A输,这局A如果不想输,那么肯定拿k/n,这样就是平局。
这样,循环下去的话,会导致最后剩下的应该是aAaaaaaAAAA这种字符串,然后A,B互取,看个数定输赢。
先想这么个答案占坑。
剩下所有 一样,就是平局好了,拿了剩下一个 也不存在 单调增的序列了,在相同字母个数 多余 剩下的序列的时候,应该是 最起码有 不败的策略的,就是删除 出现次数最多的 以外的 字母
剩下所有 一样,就是平局好了,拿了剩下一个 也不存在 单调增的序列了,在相同字母个数 多余 剩下的序列的时候,应该是 最起码有 不败的策略的,就是删除 出现次数最多的 以外的 字母
猜了个策略,大家看看对不对,或者有没有遗漏吧……我是懒得想了……(⊙﹏⊙)b。。
LSD = 最长递减子序列长度
重复数 = sum(每个字母的个数 - 1)
if LSD == 1:
if 重复数 == 1:
else if 重复数 & 1:
if 总长度 == 奇数:
else if LSD == 2:
if 重复数 == 奇数:
else if LSD & 2:
if 总长度 == 奇数:
猜了个策略,大家看看对不对,或者有没有遗漏吧……我是懒得想了……(⊙﹏⊙)b。。
LSD = 最长递减子序列长度
重复数 = sum(每个字母的个数 - 1)
if LSD == 1:
if 重复数 == 1:
else if 重复数 & 1:
if 总长度 == 奇数:
else if LSD == 2:
if 重复数 == 奇数:
else if LSD & 2:
if 总长度 == 奇数:
怎么看都觉得这题目本身就很有争议,如果两个人都足够聪明,那么第一个人就应该去设法让第二个人没法赢,有毒。。。。。。。
怎么看都觉得这题目本身就很有争议,如果两个人都足够聪明,那么第一个人就应该去设法让第二个人没法赢,有毒。。。。。。。
大神有问题请教,如何联系你
大神有问题请教,如何联系你
hela中,甲先去掉l…
hela中,甲先去掉l…
刚开始没有思路,文章给我提供了一点想法。感觉还需要排序的时候记录每段元素的原始序号,然后每取出一个字母,再重新进行一次排序。
刚开始没有思路,文章给我提供了一点想法。感觉还需要排序的时候记录每段元素的原始序号,然后每取出一个字母,再重新进行一次排序。
看了一下,一个正确答案都没有,看来这里的人不适合搞算法!题主的答案也不正确!!
看了一下,一个正确答案都没有,看来这里的人不适合搞算法!题主的答案也不正确!!
那你给个正确的吧
那你给个正确的吧
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)NIM取子游戏是由两个人面对若干堆硬币(或石子,或。。)进行的游戏,游戏由两个人进行,设有k&=1堆硬币,各堆含有n1,n2,n3,n4.....,nk个硬币,游戏的目的就是选取最后剩下的硬币。游戏规则如下:
1)游戏人交替进行游戏;
2)当轮到每个游戏人取子时,选择这些硬币中的一堆,并从所选的堆中取走至少一枚硬币(可以将所选堆中所有硬币全部取走剩下一个空堆)。
&当所有堆变成空堆时,游戏结束。最后取子的人(即能够取走最后一堆中的所有硬币的人)获胜。
这个问题中的变量是堆数k和各堆的硬币数n1,n2,n3,。。,nk,确定游戏人1还是游戏人2获胜以及游戏人应该如何取子才能获胜。
将每个堆的硬币数ni表示成基为2的数:
n1=as。。a1a0
n2=bs....b1b0
nk=rs...r1r0
我们通过在前面补0的办法可以假设,所有各堆的大小都是具有相同位数的一2为基的数。我们称游戏是平衡的当且仅当
as+bs+...+rs是偶数
ai+bi+...+ri是偶数
a1+b1+...+r1是偶数
a0+b0+...+r0是偶数
如果游戏不是平衡的,那么就称游戏是非平衡的。如果ai+bi+...+ri是偶数,那么就称第i位是平衡的,否则就称为非平衡的。
游戏人1能够在非平衡NIM取子游戏中取得胜利,而游戏人2能够在平衡NIM取子游戏中取胜。
设NIM游戏是非平衡的。令最大的非平衡位位第j位。那么,游戏人1用这样一种方法取子,使得留给游戏人2的游戏是平衡的取子游戏。令j是是最大非平衡位,游戏人1选择第j位是1的一个堆,然后从所选的堆中取走一些硬币使得游戏成为平衡的游戏。此后,无论游戏人2如何取子,游戏均是不平衡的,游戏人1取硬币总是使得游戏是平衡的,那么游戏人1就可以取得胜利。如果游戏从平衡状态开始,游戏人1取走一些硬币后,使得游戏变为非平衡,游戏人2取硬币使游戏变得平衡,从而可以取得胜利。
下面举一个简单的例子
从表中可以看出,,简单的看就是第一列,第二列,第四列1的个数是奇数,游戏是非平衡的,最大非平衡位是2^3=8,因此取一个这个位是1的进行取硬币,这里取11个硬币的堆,取5个,使得游戏变为平衡的,如下
如此进行下去,游戏人最终会取得胜利。
阅读(...) 评论()&&& 30302930282930272929302630262222181814141010662
&&& 1212346101418222630
&&& 44123321
&&& 55514&4&
&&& 6624&4&
&&& 777734&4&
&&& 44812164k44k+14k+24k+3
&&& 1111074
&&& AAOAOAOOOABCC
1. 301123430
1. 301123430
&&& 30252015105
&&& 235530
&&& 341920
&&& 10377kk

我要回帖

更多关于 当一枚硬币加速到 的文章

 

随机推荐