单词游戏算法实现

cenchure 2013-12-04 11:46:43
这个是文思海辉的在线算法题目

甲乙两个人用一个英语单词玩游戏。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序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 ;
}

这个提交的测试用例结果是失败了的, 求算法高手看看什么地方有错误了
...全文
450 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenchure 2013-12-06
  • 打赏
  • 举报
回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧