单词博弈
甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么?
甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么?
例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。 又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。
算法实现:
#include <iostream>
#include <string>
#include <map>
using namespace std;
bool is_ordered(const string& word)
{
if (word.length() <= 1)
return true;
bool order = true;
for (int i=1;i<word.length();i++)
{
if (word[i] > word[i-1])
{
continue;
}
else
{
order = false;
break;
}
}
return order;
}
typedef map<string, bool> CacheMap;
CacheMap cachemap;
bool find(const string& word)
{
// 就像一个缓存优化...
CacheMap::iterator it = cachemap.find(word);
if (it != cachemap.end())
{
return it->second; // 返回当前元素的值(it->first为key,it->second为value)
}
if (is_ordered(word))
{
cachemap[word] = false;
return false;
}
// 遍历删除某一位元素之后,如果剩下的字符串有序,则置cachemap[word] = true并返回true
for (int i=0;i<word.length();i++)
{
string nextword(word);
nextword.erase(i,1); // erase(pos,n)删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
if (!find(nextword))
{
cachemap[word] = true;
return true;
}
}
cachemap[word] = false;
return false;
}
int who(string word)
{
return int(find(word));
}
int main(int argc, char** argv)
{
char *s = "abd";
printf("%d\n",who(s));
return 0;
}