#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 26;
int vis[maxn], l[maxn][maxn], start[maxn], endd[maxn];
void dfs(int u) {
vis[u] = 1;
for (int i = 0; i < maxn; i++) {
if (l[maxn][maxn] && !vis[i]) //如果u和i之间可以连接且i没有访问过;
dfs(i);
}
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
char Lu[99];
cin >> n;
memset(l, 0, sizeof(l));
memset(start, 0, sizeof(start));
memset(endd, 0, sizeof(endd));
for (int i = 0; i < n; i++) {
cin >> Lu;
l[Lu[0] - 'a'][Lu[strlen(Lu) - 1] - 'a']++;
start[Lu[0] - 'a']++;
endd[Lu[strlen(Lu) - 1] - 'a']++;
}
int flag = true;
int num1 = 0, num2 = 0;
for (int i = 0; i < maxn; i++) {
if (!flag) break;
if (start[i] != endd[i]) {
if (start[i] = endd[i] + 1) num1++;
else if (endd[i] = start[i] + 1) num2++;
else { flag = false; break; }
}
}
if (num1 && num2 && num1 + num2 > 2) flag = false;
if (flag) {
memset(vis, 0, sizeof(vis));
for (int i = 0; i < maxn; i++) {
if (start[i]) { dfs(i); break; }
}
bool flag2 = true;
for (int i = 0; i < maxn; i++) {
if (start[i] && !vis[i]) { flag2 = false; break; }
if (endd[i] && !vis[i]) { flag2 = false; break; }
}
if (flag2)
cout << "Ordering is possible.\n";
else
cout << "The door cannot be opened.\n";
}
else
cout << "The door cannot be opened.\n";
}
return 0;
}
UVa 10129 欧拉路
最新推荐文章于 2020-09-27 21:10:16 发布