您的位置:首页 > 其它

pku2138 Travel Games (搜索)

2009-11-20 23:16 507 查看
比较简单的搜索,主要是决定任意两个字符串之间是否有题目所要求的关系

#include  <iostream>
#include  <vector>
#include  <string.h>
using  namespace std;
vector<int>   adj[1000];
char   str[1000][84];
int  len[1000];
int  first, D;
char   fstr[84];
int  ans;
#define  max(a,b)  ((a)>(b)?(a):(b))
bool strtest(int  s1, int  s2)
{
int  i, j;
if (strcmp(str[s1], str[s2]+1) == 0)
return true;
if (strncmp(str[s1], str[s2], len[s1]) == 0)
return true;

for (i=1; i<len[s1]; i++)
{
if (strncmp(str[s1], str[s2], i)==0 && strncmp(str[s1]+i, str[s2]+i+1, len[s1]-i)==0)
return true;
}
return  false;
}
void  search(int  s)
{
int  i;
if (adj[s].empty())
{
if (len[s]>len[ans])
ans = s;
return;
}
for (i=0; i<adj[s].size(); i++)
{
search(adj[s].at(i));
}
}
int  main()
{
int  i, j;
while (cin>>D)
{
cin >> fstr;
first = -1;
for (i=0; i<D; i++)
{
cin >> str[i];
len[i] = strlen(str[i]);
if (first==-1 && strcmp(str[i], fstr)==0)
first = i;
}
for (i=0; i<D; i++)
for (j=i+1; j<D; j++)
{
if (len[i]==len[j]-1 && strtest(i, j))
adj[i].push_back(j);
if (len[i]==len[j]+1 && strtest(j, i))
adj[j].push_back(i);
}
ans = first;
search(first);
cout << str[ans] << endl;
}
return  0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: