單詞博弈-華爲OJ

甲乙兩個人用一個英語單詞玩遊戲。兩個人輪流進行,每個人每次從中刪掉任意一個字母,如果剩餘的字母序列是嚴格單調遞增的(按字典序a < b < c <….<z),則這個人勝利。兩個人都足夠聰明(即如果有贏的方案,都不會選輸的方案 ),甲先開始,問他能贏麼? 輸入: 一連串英文小寫字母,長度不超過15,保證最開始的狀態不是一個嚴格單增的序列。 輸出:1表示甲可以贏,0表示甲不能贏。 例如: 輸入 bad, 則甲可以刪掉b或者a,剩餘的是ad或者bd,他就贏了,輸出1。 又如: 輸入 aaa, 則甲只能刪掉1個a,乙刪掉一個a,剩餘1個a,乙獲勝,輸出0。
輸入:
aaa
輸出:
0
【思路】
我們需要遞歸遍歷每種情形,直到發現某種情形使得甲必勝,就停止搜索。如果所有情況搜索完畢,依然不能發現存在情形使得甲勝,就判定爲乙勝。
int f(string remain,int ind); //remain指的是待處理的字符數組,ind表示當前針對甲還是乙,ind=0 for 甲,ind=1 for 乙。
int isGonnaWin(string remain);// 該函數判斷當前remain是否僅僅存在一個不符合要求的字符,如果是的話,那麼刪除該字符將會勝利,此時返回1;否則返回0。(還有一種情況是返回-1,理論上不應該出現)。

#include <iostream>
#include<string>
#include <algorithm>
#include<math.h>
using namespace std;

int f(string,int);
int isGonnaWin(string);
bool isGrowing(string s);//判斷是否嚴格遞增

int main(){
    //cout<<isGonnaWin("aaa")<<endl;
    //cout<<isGonnaWin("bad")<<endl;
    string s;
    cin>>s;
    cout<<(1+f(s,0))%2<<endl;
    system("pause");
}

int f(string s,int ind){//1st=0 for 甲,1st=1 for 乙
    int WinInd=-1;
    string cur;
    if(!isGonnaWin(s)){
        for(int i=0;i<s.length();i++){
            cur=s;
            WinInd = f(cur.erase(i,1),(ind+1)%2);
            if(WinInd=0)//刪除第i個字符後,勝者是甲,就不用繼續看下面的情況了
                return 0;
        }
        return 1;//刪除任一字符,勝者都不是甲,那麼勝者是乙了 。
    }
    return ind;// 如果isGonnaWin判定爲1,則當前的ind會贏
}

int isGonnaWin(string remain){
    // 如果僅僅有一個單詞怪異,並且刪除後嚴格遞增
    int bad_times=0, bad_loc;
    char bad_char;
    string cur;
    int i=0;
    while(1){
        if(i==remain.size()-1)
            break;
        if(remain[i+1]<=remain[i])
            bad_times=1;bad_loc=i+1; break;
        i++;
    }
    if(!bad_times){return -1;}//已經是嚴格遞增說明不會贏
    else{//如果找到了第一個不對的位置
        cur=remain;
        bool b1 = isGrowing(cur.erase(bad_loc,1));
        cur=remain;
        bool b2 = isGrowing(cur.erase(bad_loc-1,1));
        if(b1||b2){
            return 1;
        }
        return 0;
    }
}
bool isGrowing(string s){//判斷是否嚴格遞增
    for(int i=0;i<s.length()-1;i++){
        if(s[i+1]<=s[i])
            return 0;
    }
    return 1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章