#include <bits/stdc++.h>
using namespace std;
#define re register
const int N = 26;
int n;
int ma[N + 5][N + 5];
int in[N + 5], out[N + 5];
int vis[N + 5];
inline int read() {
int f = 0, fu = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
fu = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
f = (f << 3) + (f << 1) + c - 48;
c = getchar();
}
return f * fu;
}
inline void write(int x) {
if (x < 0)
x = (x ^ -1) + 1, putchar('-');
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void dfs(int u) {
vis[u] = 1;
for (int i = 1; i <= N; i = -~i) {
if (ma[u][i]) {
ma[u][i] = ma[i][u] = 0;
dfs(i);
}
}
}
int main() {
// freopen("play.in","r",stdin);
// freopen("play.out","w",stdout)d;
int t;
t = read();
while (t--) {
int st = 0, en = 0, start;
memset(ma, 0, sizeof ma);
memset(in, 0, sizeof in);
memset(out, 0, sizeof out);
memset(vis, 0, sizeof vis);
char a[1005];
n = read();
for (int i = 1, l, r; i <= n; i = -~i) {
scanf("%s", a);
int len = strlen(a);
l = a[0] - 'a' + 1;
r = a[len - 1] - 'a' + 1;
start = l;
ma[l][r] = ma[r][l] = 1;
vis[l] = vis[r] = -1;
out[l]++;
in[r]++;
}
bool flag = 1;
for (int i = 1; i <= N; i = -~i) {
if (in[i] == out[i])
continue;
if (in[i] == out[i] + 1 && !st) {
start = i;
st = 1;
} else if (out[i] == in[i] + 1 && !en) {
en = 1;
} else {
flag = 0;
break;
}
}
if (flag) {
dfs(start);
for (int i = 1; i <= N; i = -~i) {
if (vis[i] == -1) {
flag = 0;
break;
}
}
}
if (flag)
puts("Ordering is possible.");
else
puts("The door cannot be opened.");
}
return 0;
}
一本通1528:【例 2】单词游戏
最新推荐文章于 2024-08-13 14:19:35 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)