单词博弈(java)

 题目:

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

package huawei;
import java.util.HashMap;
public final class Demo
{
    public int who(String input)
    {
        HashMap hs = new HashMap();
        return WordGame(input, hs);        
    }
        //do something here
         //功能函数块
        private static int WordGame(String word, HashMap has) {
            // TODO Auto-generated method stub
            
            //要求是小写,不大于15位的英文字母,word的前提不用判断,
            //因为题目中没有说需要抛出异常,没有第三种出口,所以不用考虑
            
            
            //不用加入到容器中,是因为此次判断仅需一步
            //不用再将length为2的word加入容器中。不用再去容器中匹配,而直接判断就可以
            if (word.length() <= 2)
                return 1;
     
            //去容器中找。递归时会把已经做过测试的字符串加入Map中
            if (has.containsKey(word)) {
                if (has.get(word) == 0)
                {   //System.out.println(word+"0");
                    return 0;}
                else{
                    //System.out.println(word+"1");
                    return 1;
                }
            }
     
            if (word.length() == 3) {
                //长度为三的情况。
                if (!(word.charAt(0) < word.charAt(1) || word.charAt(1) < word
                        .charAt(2))) {
                    
                    has.put(word, 0);
                    return 0;
                }
     
                else {
                    has.put(word, 1);
                    return 1;
                }
     
            }
     
            //一个一个删,看剩的是不是严格单调递增
            for (int i = 0; i < word.length(); i++) {
                String snew = new String(word.substring(0, i)
                        + word.substring(i + 1));
                if (isOrdered(snew)) {
                    has.put(word, 1);
                    return 1;
                }
            }
     
            
            //如果还没有判断出来,就得继续下面代码了
            //下面代码才是递归,这个题的核心
            for (int i = 0; i < word.length(); i++) {
                String snew = new String(word.substring(0, i)
                        + word.substring(i + 1));
                
                //递归,如果WordGame(snew, has)==0 /他输的意思/ 你就赢了
                if (WordGame(snew, has) == 0) {
                    
                    has.put(word, 1);
                    return 1;
                }
            }
     
            //如果还没判断出来,表示你输了。
            has.put(word, 0);
            return 0;
        }
        //判断s是否是严格单调递增的函数
        public static boolean isOrdered(String s) {
     
            // if(con.contains(s) ) return true;
     
            for (int i = 0; i < s.length() - 1; i++) {
                if (s.charAt(i) >= s.charAt(i + 1)) {
                    return false;
                }
            }
     
            return true;
        }
}  

    


 

你可能感兴趣的:(java基础)