2021年河南省赛——I.七便士(思维+并查集) 2021年河南省赛——I.七便士(思维+并查集) 思路: 代码:

原题链接

思路:

可以看出,如果未填充的部分是一条链的话,可以把剩下的都添进去。比如,第一次填倒数第二个,然后移动到倒数第一个,以此类推。
用并查集判的。

代码:

#define PI acos(-1)
const int maxn=1e5+10;
const ll mod=1e9+7;
int g[10][10];
int root[15];

int Find(int x)
{
    if(x!=root[x]) root[x]=Find(root[x]);
    return root[x];
}

int main()
{
    for(int i=1; i<=8; i++)
    {
        int x=(i+2)%8+1,y=(i+4)%8+1;
        g[i][x]=g[x][i]=g[i][y]=g[y][i]=1;
    }
    int T=read;
    while(T--)
    {
        for(int i=1; i<=8; i++) root[i]=i;
        string s;
        cin>>s;
        vector<int>v;
        for(int i=0; i<s.size(); i++)
            if(s[i]=='0') v.push_back(i+1);

        bool flag=1;
        for(int i=0; i<v.size(); i++)
            for(int j=0; j<v.size(); j++)
                if(i!=j)
                {
                    if(g[v[i]][v[j]])
                    {
                        int fu=Find(v[i]),fv=Find(v[j]);
                        if(fu!=fv) root[fu]=fv;
                    }
                }
        int cnt=0;
        for(int i=0;i<v.size();i++)
            if(v[i]==Find(v[i])) cnt++;
        if(cnt==1) puts("Yes");
        else puts("No");

    }

    return 0;
}