UVALive

来源:互联网 发布:叙利亚内战 知乎 编辑:程序博客网 时间:2024/04/29 06:21

题目链接: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;}


0 0