Play on Words
要点:
先判断是否存在欧拉路,在判断是否连通;
代码:
#include <cstdio>
#include <string.h>
#include <queue>
using namespace std;
int vis[26][26], in[26], out[26], temp[26];
void dfs(int y){
temp[y] = 1;
for (int j = 0; j < 26; j++){
if (vis[y][j] && !temp[j]){
dfs(j);
}
}
}
int main(){
int t;
scanf("%d", &t);
while (t--){
memset(vis, 0, sizeof(vis));
memset(in, 0, sizeof(in));
memset(out, 0, sizeof(out));
memset(temp, 0, sizeof (temp));
int n;
scanf("%d", &n);
char word[1005];
for (int i = 0; i < n; i++){
scanf("%s", word);
vis[word[0] - 'a'][word[strlen(word) - 1] - 'a']++;
vis[word[strlen(word) - 1] - 'a'][word[0] - 'a']++;
in[word[0] - 'a']++;
out[word[strlen(word) - 1] - 'a']++;
}
bool flag = true;
int num1 = 0, num2 = 0;
for (int i = 0; i< 26; i++){
if (!flag)
break;
if (in[i] != out[i]){
if (in[i] == out[i] + 1)
num1++;
else if (out[i] == in[i] + 1)
num2++;
else {
flag = false;
break;
}
}
}
if (num1 && num2 && num1 + num2 > 2)
flag = false;
if (flag){
bool f = true;
for (int i = 0; i < 26; i++)
if(out[i]){
dfs(i);
break;
}
for (int i = 0; i < 26; i++){
if (in[i] && !temp[i]){
f = false;
break;
}
if (out[i] && !temp[i]){
f = false;
break;
}
}
if (f)
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
else
printf("The door cannot be opened.\n");
}
return 0;
}