ACM單詞拼接

單詞拼接

時間限制:3000 ms  |  內存限制:65535 KB
難度:5
描述

給你一些單詞,請你判斷能否把它們首尾串起來串成一串。

前一個單詞的結尾應該與下一個單詞的道字母相同。

aloha

dog

arachnid

gopher

tiger

rat

 

可以拼接成:aloha.arachnid.dog.gopher.rat.tiger

輸入
第一行是一個整數N(0<N<20),表示測試數據的組數
每組測試數據的第一行是一個整數M,表示該組測試數據中有M(2<M<1000)個互不相同的單詞,隨後的M行,每行是一個長度不超過30的單詞,單詞全部由小寫字母組成。
輸出
如果存在拼接方案,請輸出所有拼接方案中字典序最小的方案。(兩個單詞之間輸出一個英文句號".")
如果不存在拼接方案,則輸出
***
樣例輸入
2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm
樣例輸出
aloha.arachnid.dog.gopher.rat.tiger
***
來源

Waterloo local 2003.01.25 /POJ


個人理解:本題是歐拉回路和歐拉問題,首先遍歷單詞,記錄下每個單詞的首尾字母,進而利用回溯法來判斷這幾個單詞是否能夠實現歐拉回路或歐拉通路

代碼如下C語言

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
char s[31];
int first, last;
};

node a[1001];
int degree_in[1001], degree_out[1001], m, order[1001];
bool used[1001];

int f()
{
int x1, x2, ans = 0, i;
x1 = x2 = 0;
for (i = 0; i < 26; ++i)
{
if (abs(degree_in[i] - degree_out[i]) >= 2)
return -1;
else if (degree_in[i] - degree_out[i] == 1)
x1++;
else if (degree_in[i] - degree_out[i] == -1)
{
x2++;
ans = i;
}
}
if (x1>1 || x2 > 1)
return -1;
else if (x1 == 0)
{
for (i = 0; i < 26; ++i)
if (degree_out[i])
return i;
}
else
return ans;

}
bool cmp(node a, node b)
{
return strcmp(a.s, b.s) < 0;
}

bool dfs(int st, int cnt)
{
int i;
if (cnt == m)
return 1;
for (i = 0; i < m; ++i)
{
if (a[i].first < st || used[i])
continue;
else if (a[i].first > st)
return false;
used[i] = true;
order[cnt] = i;
if (dfs(a[i].last, cnt + 1))
return 1;
used[i] = false;
}
return false;
}


int main()
{
int N, len, i, start;
scanf("%d", &N);
while (N--)
{
memset(used, false, sizeof(used));
memset(degree_out, 0, sizeof(degree_out));
memset(degree_in, 0, sizeof(degree_in));
scanf("%d", &m);
for (i = 0; i < m; ++i)
{
scanf("%s", a[i].s);
len = strlen(a[i].s);
a[i].first = a[i].s[0] - 'a';
a[i].last = a[i].s[len - 1] - 'a';
degree_out[a[i].s[0] - 'a']++;
degree_in[a[i].s[len - 1] - 'a']++;
}
start = f();
if (start == -1)
{
printf("***\n");
continue;
}
sort(a, a + m, cmp);
if (!dfs(start, 0))
{
printf("***\n");
continue;
}
printf("%s", a[order[0]].s);
for (i = 1; i < m; i++)
printf(".%s", a[order[i]].s);
printf("\n");
}
return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章