单词博弈解题思路 文思海辉编程大赛

原创 2013年12月30日 20:50:33

博客,这里开始了我人生的又一个有意义的第一次——第一次写个人博客。

。。。好吧,主要还是学习如何写博客,记录自己成长的过程,在这里就记下这题“单词博弈”解题思路,写写个人思路,也非常欢迎江湖有志同道合的朋友共同探讨!

/******************************************************************华丽的分割线********************************************************************************/

题目详情
甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么?
输入: 一连串英文小写字母,长度不超过15,保证最开始的状态不是一个严格单增的序列。
输出:1表示甲可以赢,0表示甲不能赢。
例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。
又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。

题目不难理解,就是一场博弈,看谁先得到必胜态,思路就是去分析当前状态得到SG函数,如果下一次操作得到的状态全部是必败状态,那么推出当前状态即为必胜状态;否则,如果下次操作得到的状态中有必胜状态,那么当前状态则定义为必败状态,因为操作者可以通过当前状态到达必胜状态。
由此,我们可以通过DFS搜索,从当前状态出发,预测能得到的状态有哪些,并尝试记录已经求出的状态,避免重复搜索,实现记忆化搜索。这里,我们注意到字母序列的长度最大为15,因此我们一共会得到2^15种状态,这样做的效果很不错,希望你会喜欢!得意
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int map[33010];
int wlen;

bool checkUp(int stat,string word)
{
    char ch=123;
    for (int i=0;i<wlen;++i)
    {
        if ((1<<i)&stat)
        {
            if (word.at(wlen-i-1)>=ch)
            {
                return false;
            }
            else
            {
                ch=word.at(wlen-i-1);
            }
        }
    }
    return true;
}

int DFS(int stat,string word)
{
    if (map[stat]>-1)
    {
        return map[stat];
    }
    if (checkUp(stat,word))
    {
        return map[stat]=0;
    }
    int res=1;
    for (int i=0;(1<<i)<=stat;++i)
    {
        if ((1<<i)&stat)
        {
            res&=DFS((1<<i)^stat,word);
        }
    }
    return map[stat]=res^1;
}

class Test {
public:
   static int who (string   word)
    {
    wlen=word.length();
    int stat=(1<<wlen)-1;
    for (int i=0;i<=stat;++i)
    {
        map[i]=-1;
    }
    return DFS(stat,word);
        return 0;
    }
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{   
    cout<<Test::who("Test")<<endl;   
} 
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

相关文章推荐

文思海辉编程大赛的初体验

作为一个所学专业和计算机相去十万八千里的人,我对编程题目的印象还基本上停留在十几年前大学里教的Fortran和自己考计算机二级时学的C语言教科书上的习题。归纳起来大致有这么三种。一是做计算机被发明出来...
  • starrow
  • starrow
  • 2013年12月19日 12:13
  • 3035

文思海辉第一届在线编程大赛--开源探究

题目详情 甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a  输入: 一连串英文小写字母,长度不超过15,保证最开始...

文思海辉技术有限公司——流程管理架构平台应用

一、项目简介 1、客户介绍 文思海辉技术有限公司的前身分别是文思信息技术有限公司和海辉软件(国际)集团公司,这两家公司都是软件外包服务提供商。之后宣布合并,合并的公司中文名称为“文思海辉技...
  • authine
  • authine
  • 2017年01月05日 10:19
  • 476

文思海辉:大数据提高智慧金融竞争力

3月25日,被称为IT业界风向标的“IBM论坛2014”在中国大饭店隆重举办,千余名来自金融、电信、医疗等领域的专家学者、IT技术人员以及用户代表围绕“颠覆与创新”这一话题展开深入探讨。Pactera...

文思海辉:大数据发展—源于创新、服务于创新

大数据时代下的今天,数据作为一种信息,已经渗透到当今每一个行业和业务职能领域。人们每一次点击鼠标,每一次刷卡消费,每一次拨打电话……都会积累海量的数据,这也正是大数据中“大”的直接表现。作为领先的大数...

单词博弈解题思路,转载“miss若尘”的博客

闲话不多说,直接上原题: 题目详情 甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a 输入...
  • jh624
  • jh624
  • 2013年12月16日 17:51
  • 1959

单词博弈Java实现(借鉴“miss若尘”博客中写的解题思路)

单词博弈Java实现 ,已经通过庞果网的用例测试。 代码如下 import java.util.HashMap; public class WordGameFinalTest { p...
  • jh624
  • jh624
  • 2013年12月16日 23:19
  • 3331

软件外包企业遭资本市场冷落 文思海辉抱团求暖

面对营收增加、利润下滑的窘境,在遭受欧洲、印度同行的竞争夹击下,同在美国上市的中国软件外包企业——文思信息(VIT:NYSE)和海辉软件(HSFT:NASDAQ)选择抱团“过冬”。       8月...

英雄会第一届在线编程大赛:单词博弈 (C++代码) ---miss若尘

代码将在比赛结束后公开,请仔细阅读解题思路:

编程之美2013年大赛解题思路--初赛(A)

题目1:竞价 时间限制: 1000ms 内存限制: 256MB 描述 Alice和Bob都要向同一个商人购买钻石。商人手中有 N 颗钻石,他会将它们一颗颗地卖给他们,Alice和Bob通过竞...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单词博弈解题思路 文思海辉编程大赛
举报原因:
原因补充:

(最多只允许输入30个字)