您的位置:首页 > 其它

【CodeVS】1018 单词接龙

2015-07-03 16:10 295 查看
【分析】

先求出任意两个之间的公共长度。

注意由于单词接龙要求最长,所以两个之间的公共长度用最短的。

这道题所谓的包含不清晰,实际应该是指最短的相交部分不包括所有的,而不是最长的相交部分。

然后dfs,注意每个可以使用两次。

【小结】

有本题看出我思维的不严谨性。

①审题:2次

②没考虑特殊情况。

检查程序的鲁棒性,首先是极致,然后是自己想的一些古怪的数据,如本题自己和自己连结呢?

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

const int N=21;
const int L=300;

int n,len
; char s
[L];
int mix

; char a;
int v
,c,rc;

inline int min(int i,int j)
{
return i<j?i:j;
}

int getmix(int x,int y)
{
int mxlen=min(len[x],len[y]),i,j;
for (i=1;i<=mxlen;i++)
{
for (j=1;j<=i;j++)
if (s[x][len[x]-i+j]^s[y][j]) break;
if (j==i+1) return i;
}
return 0;
}

inline int max(int i,int j)
{
return i>j?i:j;
}

void dfs(int now)
{
int tag=0;
v[now]++;
for (int nxt=1;nxt<=n;nxt++)
if (v[nxt]<2&&mix[now][nxt]&&mix[now][nxt]!=len[now]&&mix[now][nxt]!=len[nxt])
{
c+=len[nxt]-mix[now][nxt];
dfs(nxt),tag=1;
c-=len[nxt]-mix[now][nxt];
}
v[now]--;
if (!tag) rc=max(rc,c);
}

int main(void)
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%s",&s[i][1]),len[i]=strlen(&s[i][1]);
scanf("\n%c",&a);

for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
mix[i][j]=getmix(i,j);

for (int i=1;i<=n;i++)
if (s[i][1]==a) c=len[i],dfs(i),c=0;
printf("%d\n",rc);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: