题意:按照一个单词的最后一个字母和另一个字母的第一个字母就可以相连,是否可以实现把所有的单词按照这种方式连接起来(第一个单词的首字母可以不与最后一个单词的最后一个字相同)能实现输出Ordering...,不能实现输出The ......
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
int map[101][101];
int v[101];
int n;
int a[100],b[100];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
char s[1010];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(v,0,sizeof(v));
memset(map,0,sizeof(map));
scanf("%d",&n);
for(int i=0; i<n; i++)
{
memset(s,0,sizeof(s));
scanf("%s",s);
int len = strlen(s);
int x = s[0] - 'a';
int y = s[len-1] - 'a';
map[x][y] = 1;
a[x]++;
b[y]++;
v[y] = 1;
}
int psum = 0;
int qsum = 0;
int sum1 = 0;
for(int i=0; i<26; i++)
{
sum1 += v[i];
int c = a[i] - b[i];
if(c<0)
{
qsum += (-c);
}
else
{
psum += c;
}
}
for(int i=0; i<26; i++)
{
for(int j=0; j<26; j++)
{
for(int k=0; k<26; k++)
{
if(map[j][i] == 1 && map[i][k] == 1)
{
map[j][k] = 1;
}
}
}
}
int flag = 0;
for(int i=0; i<26; i++)
{
int count = 0;
for(int j=0; j<26; j++)
{
if(map[i][j] == 1 && v[j] == 1)
{
count++;
}
}
//printf("sum1 = %d count = %d\n",sum1,count);
if(sum1 == count)
{
flag = 1;
//printf("i = %d\n",i);
break;
}
}
if((psum == 1 && qsum == 1) || (psum == 0 && qsum == 0))
{
if(flag == 1)
{
printf("Ordering is possible.\n");
}
else
{
printf("The door cannot be opened.\n");
}
}
else
{
printf("The door cannot be opened.\n");
}
}
return 0;
}