//UVA10129PlayOnwords
#include<cstdio>
#include<cstdlib>
#include<cstring>
//#define LOCAL
const int MAXC = 1000 + 10;
const int MAXT = 100000 + 10;
int front[256];
int back[256];
char s[MAXC];
bool G[256][256];
bool visited[256];
int tap;
bool dfs(char c, int point) {//tap为连通区域标记
if(visited[c] > 0) return true;
visited[c] = point;
for(int i = 'a'; i <= 'z'; i++) {
if(visited[i] || !G[c][i]) {
continue;
// printf("i = %c\n", i);
}
else dfs(i, point);
}
}
int main() {
int T;
#ifdef LOCAL
freopen("UVA10129in.txt", "r", stdin);
freopen("UVA10129out.txt", "w", stdout);
#endif
scanf("%d", &T);
while(T--) {
tap = 0;
memset(front, 0, sizeof(front));
memset(back, 0, sizeof(back));
memset(visited, 0, sizeof(visited));
memset(G, 0, sizeof(G));
int n;
scanf("%d", &n);
while(n--) {
scanf("%s", s);
char a = s[0], b = s[strlen(s) - 1];
front[a]++; back[b]++;
G[a][b]++; G[b][a]++;
}
int cnt = 0, judge = 0, tag = 0, flag = 1;
for(int i = 'a'; i <= 'z'; i++) {
if(front[i] == back[i]) continue;
cnt++;
if(cnt > 2) {
flag = 0; break;
}
if(front[i] - back[i] == 1) tag |= 2;
else if(front[i] - back[i] == -1) tag |= 1;
else {
flag = 0; break;
}
}//欧拉通路充要条件
if(cnt == 1) flag = 0;
//printf("cnt = %d\n", cnt);
//printf("flag = %d, tag = %d\n", flag, tag);
if(!(flag && ( tag == 3 || tag == 0))) {
printf("The door cannot be opened.\n");
continue;
}
for(int i = 'a'; i <= 'z'; i++) {
if(!visited[i] && (front[i] || back[i])) dfs(i, ++tap);
}
/*for(int i = 'a'; i <= 'z'; i++) {
for(int j = 'a'; j <= 'z'; j++) {
printf("%d", G[i][j]);
}
printf("\n");
}*/
//printf("tap = %d\n", tap);
if(tap == 1) printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}
return 0;
}
/*
3
2
acm
ibm
3
acm
malform
mouse
2
ok
ok
*/
UVA10129PlayOnWords
最新推荐文章于 2021-02-02 21:47:24 发布