思路:
如果有环,那么直接循环造一个20*20的图即可。
如果没有,那么就找到那个最长的串,看其能构成最大的正方形就可以了。
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1000;
bool q[30][30];
char ans[30],temp[30];
bool vis[30];
int flag,ans_l;
int n;
int loop;
void dfs(int x,int cnt)
{
if(flag)return;
vis[x]=1;
temp[cnt-1]=x+'a';
if(cnt>ans_l)
{
temp[cnt]=0;
ans_l=cnt;
strcpy(ans,temp);
}
for(int i=0; i<26; ++i)
{
if(!q[x][i])
{
if(i!=loop)
{
if(!vis[i])
dfs(i,cnt+1);
}
else
{
temp[cnt]=0;
ans_l=cnt;
strcpy(ans,temp);
flag=1;
}
}
if(flag)return;
}
vis[x]=0;
}
int main()
{
int t;
int i,j;
char s[10];
scanf("%d",&t);
while(t--)
{
memset(q,0,sizeof(q));
scanf("%d",&n);
for(i=0; i<n; ++i)
{
scanf("%s",s);
q[s[0]-'a'][s[1]-'a']=1;
}
flag=0;
ans_l=0;
for(i=0; i<26; ++i)
{
memset(vis,0,sizeof(vis));
loop=i;
dfs(i,1);
if(flag)break;
}
if(!flag)
{
int l=(ans_l+1)/2;
int t=0;
for(i=1; i<=l; ++i)
{
for(j=t; j<t+l; ++j)
{
printf("%c",ans[j]);
}
puts("");
t++;
}
}
else
{
int t=0;
int l=ans_l;
for(i=1; i<=20; ++i)
{
for(j=0; j<20; ++j)
{
printf("%c",ans[(j+t)%l]);
}
puts("");
t++;
}
}
}
return 0;
}