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;
}