描述
给你一些单词,请你判断能否把它们首尾串起来串成一串。
前一个单词的结尾应该与下一个单词的道字母相同。
如
aloha dog arachnid gopher tiger rat
可以拼接成:aloha.arachnid.dog.gopher.rat.tiger
就是搜索到满足题意的最小的字符串,我能求出满足的串,可是却不知道怎么处理最小的问题,所以就郁闷了。。。。。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
char map[1005][35];
int v,u;
bool flag,vis[1005];
int step[1005];
void dfs(int v,int n)
{
vis[v] = true;
for(int j=0; j<n; j++)
{
int k = strlen(map[v]);
if(!vis[j]&&map[j][0]==map[v][k-1])
{
step[v] = j;
dfs(j,n);
}
}
}
void print_step(int v,int n)
{
int cout =1;
while(cout<n)
{
printf("%s.",map[v]);
v = step[v];
cout++;
}
printf("%s\n",map[v]);
}
void camp(int n)
{
char str[35],tal[35];
int i;
memset(tal,'z',sizeof(tal));
memset(vis,false,sizeof(vis));
for(i=0; i<n; i++)
{
gets(map[i]);
if(strcmp(tal,map[i])>0)
{
v = i;
strcpy(tal,map[i]);
}
}
dfs(v, n);
for(i=0; i<n; i++)
if(!vis[i])
{
printf("***\n");
return;
}
print_step(v,n);
return;
}
int main()
{
int ncase, n;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d",&n);
getchar();
camp(n);
}
system("pause");
return 0;
}
下面是我又写的,可以算出最小的,可是提交时却TML 。各种不高兴啊
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
char map[1005][35];
int v,u;
bool flag,ok,vis[1005];
int step[1005];
#define max 30000
char a[max],b[max];
void dfs(int v,int n,int num)
{
if(num==n)
{
flag = true;
return;
}
vis[v] = true;
for(int j=0; j<n; j++)
{
int k = strlen(map[v]);
if(!vis[j]&&map[j][0]==map[v][k-1])
{
step[v] = j;
dfs(j,n,num+1);
}
}
}
void print_step(int v,int n)
{
int cout =1;
while(cout<n)
{
strcat(a,map[v]);
strcat(a,".");
v = step[v];
cout++;
}
strcat(a,map[v]);
}
void camp(int n)
{
int i; ok =false;
memset(b,'z',sizeof(b));
for(i=0; i<n; i++)
gets(map[i]);
for(i=0; i<n; i++)
{
memset(vis,false,sizeof(vis));
memset(a,'\0',sizeof(a));
flag = false;
dfs(i, n, 1);
if(flag)
{
print_step(i,n);
if(strcmp(a,b)<0)
strcpy(b,a);
ok = true;
}
}
if(ok) printf("%s\n",b);
else printf("***\n");
}
int main()
{
int ncase, n;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d",&n);
getchar();
camp(n);
}
return 0;
}