描述:题意就是通过每行字符的第一个字母和最后一个字母看是否能够连成一串,我才用了欧拉回路判重的方法,不过要事先解决好是否能够构成回路,也就是说出度和入度问题,出度和入度如果完全相同,那么随便找一个点进行欧拉回路就可以;如果入度与出度相差超过了2(包含2),那么肯定无法来成一串;并且最多只能有两个节点的入度和出度分别呈现1和-1(要么没有),才可以连成一串。明白了这些后,然后就可以写代码了,希望你能一次AC!!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int flag,visit[27],s[27][27];
void dfs(int num)
{
visit[num]=0;;
for(int i=0; i<26; i++)
if(visit[i]&&s[num][i]) dfs(i);
}
int main()
{
//freopen("a.txt","r",stdin);
int n,m,site;
int s_row[27],s_col[27];
char str[1010];
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
for(int i=0; i<26; i++) s_row[i]=s_col[i]=visit[i]=0;
memset(s,0,sizeof(s));
getchar();
while(m--)
{
memset(str,0,sizeof(str));
gets(str);
s_row[str[0]-'a']++;
int c=strlen(str)-1;
s_col[str[c]-'a']++;
visit[str[0]-'a']++;
visit[str[c]-'a']++;
s[str[0]-'a'][str[c]-'a']=1;
site=str[0]-'a';
}
int in,out;
flag=in=out=0;
for(int i=0; i<26; i++)
if(s_row[i]-s_col[i]==-1) in++;
else if(s_row[i]-s_col[i]==1)
{
out++;
site=i;
}
else if(s_row[i]-s_col[i]!=0) flag=1;
if(flag)
{
printf("The door cannot be opened.\n");
continue;
}
if((!in&&!out)||(in==1&&out==1)) dfs(site);
for(int i=0; i<26; i++) flag+=visit[i];
if(flag) printf("The door cannot be opened.\n");
else printf("Ordering is possible.\n");
}
return 0;
}