UVA10129PlayOnWords

来源:互联网 发布:单片机usb通讯协议 编辑:程序博客网 时间:2024/05/18 01:52
//UVA10129PlayOnwords #include<cstdio>#include<cstdlib>#include<cstring> //#define LOCALconst 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 LOCALfreopen("UVA10129in.txt", "r", stdin);freopen("UVA10129out.txt", "w", stdout);#endifscanf("%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;}/*32acmibm3acmmalformmouse2okok*/