单词游戏算法实现
这个是文思海辉的在线算法题目
甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <....<z),则这个人胜利。两个人都足够聪明(即如果有赢的方案,都不会选输的方案 ),甲先开始,问他能赢么?
输入: 一连串英文小写字母,长度不超过15,保证最开始的状态不是一个严格单增的序列。
输出:1表示甲可以赢,0表示甲不能赢。
例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。
又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。
C:int who (const char * word);
实现如下:
int g_HashTable[5120];
int GetHashValue(const char* word,int len)
{
int result =0;
for( int i = 0 ; i< len ; i++)
{
char a = word[i] -'a';
result+=(a+26*i);
}
return result ;
}
void MoveWords(char *newword, const char * word,int i,int len)
{
if( i ==0)
{
memcpy(newword,word+1,len); //去掉第一个字符
}
else if( i == (len -1))
{
memcpy(newword,word,len-1); //去掉最后一个字符
newword[len]=0x00;
}
else//去掉中间字符
{
memcpy(newword,word,i);
memcpy(newword+i,word+i+1,len -i-1);
}
}
bool IsWin(const char * word,const int len)
{
int i = 1;
for( ;i<len ; i++)
{
if(word[i-1]>=word[i])
return false ;
}
return true;
}
int who(const char* word)
{
#define MAX 16
char newword[MAX];
char opword[MAX];
int len = strlen(word);
int i = 0;
int j = 0;
int oplen = len -1;
int hashvalue = 0 ;
int r = 0;
if(len<=2)
return 1;
else if( len ==3)
{
if(*word<*(word+1))
return 1;
if(*word<*(word+2))
return 1;
if(*(word+1)<*(word+2))
return 1;
return 0 ;
}
else//>=4
{
for(i = 0; i< len ; i++)
{
r = 0 ;
MoveWords(newword,word,i,len); //甲移出一个字符
if(IsWin(newword,oplen))
return 1;
for( int j =0; j<oplen;j++)
{
MoveWords(opword,newword,j,oplen); //乙移出一个字符
if(IsWin(opword,oplen -1))//如果WIN,则甲的移出字符不对
break;
hashvalue = GetHashValue(opword,oplen -1);
if(g_HashTable[hashvalue ]<0)
{
g_HashTable[hashvalue] =who(opword);
}
r+=g_HashTable[hashvalue] ;
}
if( r == oplen ) //全都正确
return 1;
}
return 0;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
for( ; i< 5120; i++)
{
g_HashTable[i] = -1;
}
DWORD dw = GetTickCount();
printf("1 == result %d\n",who("tsrqponmlkjihgf"));
dw = GetTickCount() - dw ;
}
这个提交的测试用例结果是失败了的, 求算法高手看看什么地方有错误了