UVa-10129 Play on Words

  1 #include <bits/stdc++.h>
  2 
  3 const int maxn = 28;
  4 using namespace std;
  5 
  6 int G[maxn][maxn];
  7 int tmpG[maxn][maxn];
  8 int known[maxn];
  9 void DFS(int s)
 10 {
 11     for(int u=0; u<maxn; u++)
 12     {
 13         if(!known[u]&&tmpG[s][u])
 14         {
 15             known[u] = 1;
 16             DFS(u);
 17         }
 18     }
 19     return ;
 20 }
 21 
 22 bool bing(int vnum)
 23 {
 24     int count = 0;
 25     DFS(0);
 26     for(int i = 0;i < maxn;i ++)
 27     {
 28         if(known[i]>0)
 29             count ++;
 30     }
 31     return count==vnum;
 32 }
 33 
 34 int main()
 35 {
 36     int T;
 37     cin >> T;
 38     while(T --)
 39     {
 40         memset(G,0,sizeof(G));
 41         memset(tmpG,0,sizeof(tmpG));
 42         memset(known,0,sizeof(known));
 43         int vnum = 0;
 44         int v[maxn] {0};
 45         int n;
 46         cin >> n;
 47 
 48         int out[maxn] {0};
 49         int in[maxn] {0};
 50 
 51         vector<int> diff;
 52         while(n --)
 53         {
 54             string tmp;
 55             cin >> tmp;
 56             G[tmp[0]-'a'][tmp[tmp.size()-1]-'a'] ++;
 57             tmpG[tmp[0]-'a'][tmp[tmp.size()-1]-'a'] = 1;
 58             tmpG[tmp[tmp.size()-1]-'a'][tmp[0]-'a'] = 1;
 59             if(v[tmp[0]-'a']==0)
 60             {
 61                 v[tmp[0]-'a'] = 1;
 62                 vnum ++;
 63             }
 64             if(v[tmp[tmp.size()-1]-'a']==0)
 65             {
 66                 v[tmp[tmp.size()-1]-'a'] = 1;
 67                 vnum ++;
 68             }
 69         }
 70 
 71         if(!bing(vnum))
 72         {
 73             cout << "The door cannot be opened." << endl;
 74             continue;
 75         }
 76 
 77         for(int i = 0; i < maxn; i ++)
 78         {
 79             int sum = 0;
 80             for(int j = 0; j < maxn; j ++)
 81             {
 82                 sum += G[i][j];
 83             }
 84             in[i] = sum;
 85         }
 86 
 87         for(int i = 0; i < maxn; i ++)
 88         {
 89             int sum = 0;
 90             for(int j = 0; j < maxn; j ++)
 91             {
 92                 sum += G[j][i];
 93             }
 94             out[i] = sum;
 95         }
 96 
 97         for(int i = 0; i < maxn; i ++)
 98         {
 99             if(in[i]!=out[i])
100                 diff.push_back(in[i]-out[i]);
101         }
102 
103         if(diff.size()==0)
104         {
105             cout << "Ordering is possible." << endl;
106             continue;
107         }
108         else if(diff.size()==2)
109         {
110             if(diff[0]==-1&&diff[1]==1||diff[0]==1&&diff[1]==-1)
111             {
112                 cout << "Ordering is possible." << endl;
113                 continue;
114             }
115         }
116         cout << "The door cannot be opened." << endl;
117     }
118     return 0;
119 }
原文地址:https://www.cnblogs.com/Asurudo/p/9991256.html