K

来源:互联网 发布:360软件认证后台 编辑:程序博客网 时间:2024/04/28 20:39

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4601

思路:

如果有环,那么直接循环造一个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;}




1 0
原创粉丝点击