文思海辉那道编程比赛的题目

题目详情

甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么?

输入: 一连串英文小写字母,长度不超过15,保证最开始的状态不是一个严格单增的序列。

输出:1表示甲可以赢,0表示甲不能赢。

例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。

又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。


解题思路:

这实际上是一个博弈问题,在一个状态图中计算必败态和胜态。状态图中的结点就是字符串,甲乙两人每走一步都会导致状态的变化。这是一个无偏博弈,对于任意一个输入的字符串而言,状态图中的必败态和胜态都是确定的。因为两人都足够聪明,所以,从一开始胜负就已经确定。

初始的必败态是逆序为0的字符串,而且对于逆序为0的字符串来说,在状态图中就不再有出边了。

例如,对于字符串cbad而言,其状态图如下:

这个状态图中列出了所有可能的状态转换。其中红色的为必败态,其他颜色为胜态,因为初始字符串是胜态,所以甲赢。

但是从图中可以看出,甲赢的途径只有一个就是删除d,状态转换为cba,这样乙就面临必败态,怎么走都是败。因为甲足够聪明,所以最终是甲赢。


本人完成了一个程序,下面是一些小的例子;

输入:cbad

状态图:cbad-->bad; cbad-->cad; cbad-->cbd; cbad-->cba; cba-->ba; cba-->ca; cba-->cb; cbd-->bd; cbd-->cd; cbd-->cb; cad-->ad; cad-->cd; cad-->ca; bad-->ad; bad-->bd; bad-->ba; cb-->b; cb-->c; ca-->a; ca-->c; ba-->a; ba-->b
胜态:cbad, cb, ca, ba, cbd, cad, bad

必败态:cba, ad, cd, bd, a, c, b

结局:甲赢


输入:abdecgk

状态图:abdecgk-->bdecgk; abdecgk-->adecgk; abdecgk-->abecgk; abdecgk-->abdcgk; abdecgk-->abdegk; abdecgk-->abdeck; abdecgk-->abdecg; abdecg-->bdecg; abdecg-->adecg; abdecg-->abecg; abdecg-->abdcg; abdecg-->abdeg; abdecg-->abdec; abdeck-->bdeck; abdeck-->adeck; abdeck-->abeck; abdeck-->abdck; abdeck-->abdek; abdeck-->abdec; abdcgk-->bdcgk; abdcgk-->adcgk; abdcgk-->abcgk; abdcgk-->abdgk; abdcgk-->abdck; abdcgk-->abdcg; abecgk-->becgk; abecgk-->aecgk; abecgk-->abcgk; abecgk-->abegk; abecgk-->abeck; abecgk-->abecg; adecgk-->decgk; adecgk-->aecgk; adecgk-->adcgk; adecgk-->adegk; adecgk-->adeck; adecgk-->adecg; bdecgk-->decgk; bdecgk-->becgk; bdecgk-->bdcgk; bdecgk-->bdegk; bdecgk-->bdeck; bdecgk-->bdecg; decgk-->ecgk; decgk-->dcgk; decgk-->degk; decgk-->deck; decgk-->decg; aecgk-->ecgk; aecgk-->acgk; aecgk-->aegk; aecgk-->aeck; aecgk-->aecg; becgk-->ecgk; becgk-->bcgk; becgk-->begk; becgk-->beck; becgk-->becg; adcgk-->dcgk; adcgk-->acgk; adcgk-->adgk; adcgk-->adck; adcgk-->adcg; bdcgk-->dcgk; bdcgk-->bcgk; bdcgk-->bdgk; bdcgk-->bdck; bdcgk-->bdcg; abdck-->bdck; abdck-->adck; abdck-->abck; abdck-->abdk; abdck-->abdc; abeck-->beck; abeck-->aeck; abeck-->abck; abeck-->abek; abeck-->abec; adeck-->deck; adeck-->aeck; adeck-->adck; adeck-->adek; adeck-->adec; bdeck-->deck; bdeck-->beck; bdeck-->bdck; bdeck-->bdek; bdeck-->bdec; abdec-->bdec; abdec-->adec; abdec-->abec; abdec-->abdc; abdec-->abde; abdcg-->bdcg; abdcg-->adcg; abdcg-->abcg; abdcg-->abdg; abdcg-->abdc; abecg-->becg; abecg-->aecg; abecg-->abcg; abecg-->abeg; abecg-->abec; adecg-->decg; adecg-->aecg; adecg-->adcg; adecg-->adeg; adecg-->adec; bdecg-->decg; bdecg-->becg; bdecg-->bdcg; bdecg-->bdeg; bdecg-->bdec; bdec-->dec; bdec-->bec; bdec-->bdc; bdec-->bde; adec-->dec; adec-->aec; adec-->adc; adec-->ade; abec-->bec; abec-->aec; abec-->abc; abec-->abe; abdc-->bdc; abdc-->adc; abdc-->abc; abdc-->abd; bdcg-->dcg; bdcg-->bcg; bdcg-->bdg; bdcg-->bdc; bdck-->dck; bdck-->bck; bdck-->bdk; bdck-->bdc; adcg-->dcg; adcg-->acg; adcg-->adg; adcg-->adc; adck-->dck; adck-->ack; adck-->adk; adck-->adc; becg-->ecg; becg-->bcg; becg-->beg; becg-->bec; beck-->eck; beck-->bck; beck-->bek; beck-->bec; aecg-->ecg; aecg-->acg; aecg-->aeg; aecg-->aec; aeck-->eck; aeck-->ack; aeck-->aek; aeck-->aec; decg-->ecg; decg-->dcg; decg-->deg; decg-->dec; deck-->eck; deck-->dck; deck-->dek; deck-->dec; dcgk-->cgk; dcgk-->dgk; dcgk-->dck; dcgk-->dcg; ecgk-->cgk; ecgk-->egk; ecgk-->eck; ecgk-->ecg; eck-->ck; eck-->ek; eck-->ec; ecg-->cg; ecg-->eg; ecg-->ec; dck-->ck; dck-->dk; dck-->dc; dcg-->cg; dcg-->dg; dcg-->dc; adc-->dc; adc-->ac; adc-->ad; aec-->ec; aec-->ac; aec-->ae; bdc-->dc; bdc-->bc; bdc-->bd; bec-->ec; bec-->bc; bec-->be; dec-->ec; dec-->dc; dec-->de; dc-->c; dc-->d; ec-->c; ec-->e

胜态:dc, ec, eck, ecg, dck, dcg, adc, aec, bdc, bec, dec, bdec, adec, abec, abdc, bdcg, bdck, adcg, adck, becg, beck, aecg, aeck, decg, deck, dcgk, ecgk, decgk, aecgk, becgk, adcgk, bdcgk, abdck, abeck, adeck, bdeck, abdec, abdcg, abecg, adecg, bdecg, abdecg, abdeck, abdcgk, abecgk, adecgk, bdecgk, abdecgk

败态:abdegk, bdegk, adegk, abegk, abdgk, abcgk, abdek, abdeg, bdeg, adeg, abeg, abdg, abcg, abde, bdek, adek, abek, abdk, abck, bdgk, adgk, begk, bcgk, aegk, acgk, degk, egk, dgk, cgk, dek, deg, aek, aeg, bek, beg, adk, ack, adg, acg, bdk, bck, bdg, bcg, abd, abe, abc, ade, bde, de, be, bd, bc, ae, ad, ac, dg, dk, eg, cg, ek, ck, e, d, c

结局:甲胜。


输入:acbjiaa

状态图:略

胜态:acbjia, acbjaa, acbiaa, acjiaa, abjiaa, cbjiaa, cbja, acba, cbia, cbaa, abaa, acaa, cjia, ajia, bjia, cjaa, ajaa, bjaa, ciaa, aiaa, biaa, jiaa, acbji, cbjia, cb, ba, ca, aa, ia, ji, ja, aia, cia, bia, cbi, aca, aba, acb, aja, aji, cja, cji, bja, bji, cbj, abja, acbj, acja, abji, abia, acbi, acji, acia

败态:acbjiaa, bjiaa, ajiaa, cjiaa, aciaa, abiaa, cbiaa, acbaa, acjaa, abjaa, cbjaa, acbja, acbia, acjia, abjia, cbji, iaa, jaa, jia, aaa, caa, baa, cba, aci, abi, acj, abj, bj, cj, aj, ab, ac, bi, ci, ai, j, i, a, c, b

结局:甲输


本人参加了比赛,可是提交代码之后,貌似因为时间超过三秒,根本没资格获奖了,不知为何,悲催?

因此把解题过程列出来,与各位交流。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值