正文

单词接龙2007-04-16 12:19:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/24931.html

分享到:

单词接龙 
Problem description
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“

龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为

beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

 
Input
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。

你可以假定以此字母开头的“龙”一定存在。

 
Output
只需输出以此字母开头的最长的“龙”的长度。

 
Sample Input
5
at
touch
cheat
choose
tact
a
 
Sample Output
23
 
Problem Source
NOIP2000

 
// 开始题意理解错了,提交几次都不成功,后来仔细想了想,呵终于AC了
// 下面是代码
// 主要用到了栈,其次就是字符串的灵活处理。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_WORD_LENGTH 20
#define MAX_WORD 20
#define WORD_USE_MAX 2
#define TRUE 1
#define FALSE 0
#define FAILED 1
#define SUCCESS !FAILED

typedef struct stackk{
 int  findIndex;
 int  wordIndex;
 int  addLength;
}STACK;

STACK stk[MAX_WORD * 2 + 2];
char  word[MAX_WORD][MAX_WORD_LENGTH];
char  wordUseStatus[MAX_WORD];
char  dragon[MAX_WORD * MAX_WORD_LENGTH];

int initDragon(char head,int *index,int nWord,int *length){
 int i = *index;

 for(; i < nWord; i ++){
  if(word[i][0] == head){
   *index = i + 1;
   wordUseStatus[i] = 1;
   *length = strlen(word[i]);
   stk[0].addLength = *length;
   stk[0].findIndex = 0;
   stk[0].wordIndex = i;
   strcpy(dragon,word[i]);
   return SUCCESS;
  }
 }
 return FAILED;
}

int pushDragonWord(int stkIndex,int nWord,int *length){
 int  i,j,add;
 char *pDragonEnd,*pWord,*pStart,*pEnd;

 i = stk[stkIndex].findIndex;
 pDragonEnd = dragon + strlen(dragon) - 1;
 for(i; i < nWord; i++){
  if(wordUseStatus[i] >= WORD_USE_MAX)
   continue;
  if(strlen(dragon) > strlen(word[i]))
   pEnd = dragon+(strlen(dragon)-strlen(word[i]));
  else
   pEnd = dragon;
  pStart=pDragonEnd;
  for(j=0,pWord=&word[i][0]; pStart!=pEnd && *pWord && *pStart;){
   if(*pWord != *pStart){
    pStart = pDragonEnd - (++j);
    pWord = &word[i][0];
   }
   else{
    pWord++;
    pStart++;
   }
  }
  if(*pStart == '\0'){
    pStart = pDragonEnd - j;
    add = strlen(word[i]) - strlen(pStart);
    *length = *length + add;
    stk[stkIndex].findIndex = i + 1;
    stk[stkIndex+1].addLength = add;
    stk[stkIndex+1].findIndex = 0;
    stk[stkIndex+1].wordIndex = i;
    wordUseStatus[i] ++;
    strcpy(pStart,word[i]);
    return SUCCESS;
  }
 }
 return FAILED;
}

void popDragonWord(int stkIndex,int *length){
 stk[stkIndex-1].findIndex = stk[stkIndex].wordIndex + 1;
 *(dragon + strlen(dragon) - stk[stkIndex].addLength) = '\0';
 *length = *length - stk[stkIndex].addLength;
 wordUseStatus[ stk[stkIndex].wordIndex ] --;
}

int main(){
 int  i,nWord,stkIndex,startIndex;
 int  tempLength,maxLength;
 char dragonHead;
 
 scanf("%d",&nWord);
 for(i = 0; i < nWord; i ++)
  scanf("%s",word[i]);
 getchar();
 scanf("%c",&dragonHead);
 memset(wordUseStatus,0,MAX_WORD);
 for(maxLength = tempLength = startIndex = 0;;){
  if(initDragon(dragonHead,&startIndex,nWord,&tempLength) == FAILED)
   break;  
  else
   stkIndex = 0;
  while(TRUE){
   if(pushDragonWord(stkIndex,nWord,&tempLength) != FAILED)
    stkIndex ++;
   else if(stkIndex > 0){
    maxLength = (tempLength > maxLength ? tempLength : maxLength);
    popDragonWord(stkIndex,&tempLength);
    stkIndex --;
   }
   else
    break;
  }
  maxLength=(tempLength>maxLength ? tempLength : maxLength);
 }
 printf("%d\n",maxLength);
 return 0;
}

阅读(3949) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册