题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4601
题意:给你一些只有2个长度的字符串,让你尽量打印出一个大的m*m的矩阵,矩阵中横竖都不包括给出的字符串,最大20。
思路:对建立 的图求出他的补图,如果补图中存在环路,则存在一条链可以无限长,一定可以打印出一个20*20的矩阵。否则矩阵的大小为(最长路的长度+1)/2
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long int ll;
int mp[33][33];
char ch[6];
int ji[33];
int lu[33];
bool vis[33];
int mm;
bool is;
int top;
int flag;
void dfs(int rt,int root)
{
if(is) return ;
if(vis[rt])
{
if(root==rt){
is=1;
flag=rt;
}
return ;
}
ji[top++]=rt;
if(mm<top)
{
mm=top;
for(int i=0;i<top;i++) lu[i]=ji[i];
}
vis[rt]=1;
for(int i=0;i<26;i++)
{
if(!mp[rt][i]) dfs(i,root);
if(is) return ;
}
top--;
vis[rt]=0;
}
int main()
{
int t; cin>>t;
while(t--)
{
is=mm=0;
int n;
cin>>n;
memset(mp,0,sizeof(mp));
while(n--)
{
scanf("%s",&ch);
mp[ch[0]-'a'][ch[1]-'a']=1;
}
for(int i=0;i<26&&is==0;i++)
{
top=0;
memset(vis,0,sizeof(vis));
dfs(i,i);
}
if(is)
{
int i;
int ss=0;
for(int ii=0;ii<20;ii++)
{
for(int jj=0;jj<20;jj++) printf("%c",'a'+(ji[(ii+jj)%top]));
cout<<endl;
}
}
else
{
for(int ii=0;ii<(mm+1)/2;ii++)
{
for(int jj=0;jj<(mm+1)/2;jj++) printf("%c",'a'+(lu[(ii+jj)]));
cout<<endl;
}
}
}
return 0;
}