您的位置:首页 > 其它

NOIP 2000 单词接龙

2015-09-15 09:35 197 查看
DFS

这个题看数据范围显然深搜是可以的。

然而本蒟蒻的代码实在是太麻烦 没有脸公开QAQ

但是看到一段优美的代码 (没有传字符数组有木有 只有两个整数)

于是跑来发个题解~~

原代码链接在这里

原代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char str[20][1001];
char tmp[1001];
int f[20][20];
int used[20];
int ans;
int n;

void srch(int k, int len)
{
int i;
if(len > ans){
ans = len;
}
used[k]++;
for(i = 0; i < n; i++){
if(f[k][i] > 0 && used[i] < 2){
srch(i, len + f[k][i]);
}
}
used[k]--;
}

int main(int argc, char **argv)
{
int i, j;
char *p, c;
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%s\n", str[i]);
}
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
strcpy(tmp, str[i]);
p = &tmp[strlen(tmp) - 1];
while(p != tmp){
if(*p == str[j][0] && strncmp(p, str[j], strlen(p)) == 0){
f[i][j] = strlen(str[j]) - strlen(p);
break;
}
p--;
}
}
}
scanf("%c", &c);
for(i = 0; i < n; i++){
if(str[i][0] == c){
srch(i, strlen(str[i]));
}
}
printf("%d\n", ans);
return 0;
}


这是我的代码 区别么…… 可以说太蒟蒻了不知strcmp怎么加长度 于是自己编了一个 mctrcmp才过么……

#include <cstdio>
#include <cstring>
char str[20][1001];
char tmp[1001];
int f[20][20];
int used[20];
int ans,n;

void srch(int k,int len)
{
int i;
if(len>ans)ans=len;
used[k]++;
for(int i=0;i<n;i++)
{
if(f[k][i]>0&&used[i]<2)
{
srch(i,len+f[k][i]);
}
}
used[k]--;
}
inline int mstrcmp(char *p1,char *p2,int len)
{
for(int i=0;i<len;i++)
if(p1[i]!=p2[i])return 1;
return 0;
}
int main()
{
int i,j;
char *p,c;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s\n",str[i]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
strcpy(tmp,str[i]);
p=&tmp[strlen(tmp)-1];
while(p!=tmp)
{
if(*p==str[j][0]&&mstrcmp(p,str[j],strlen(p))==0)
{
f[i][j]=strlen(str[j])-strlen(p);
break;
}
p--;
}
}
scanf("%c",&c);
for(int i=0;i<n;i++)
if(str[i][0]==c)
srch(i,strlen(str[i]));
printf("%d\n",ans);
return 0;
}


//k表示当前字符串以k结尾 len表示字符串合并到目前的长度

//由于之前的只有第k个字符串的结尾对当前的合并有影响 所以只要记录之前的字符串有无合并并且当前结尾字符串是什么就可以进行深搜

//f[i][j] 表示以第i个字符串结尾的合并字符串(也可以未合并 i当做第一个)与 第j个字符串合并后的贡献 即增加的长度

//代码很好懂 就多说了~

//有没有觉得很优美~~

既然选择了远方,便只顾风雨兼程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: