2021河南省赛 I七便士
作者:互联网
题意:
给出你的一个长度为8字符串,由1和0构成,1代表当前位置上放了一个便士,0代表没放,我们想放至少7个便士.
放一个便士满足两个条件:
当前位置是x
- 第一个条件当前位置没有便士.
- 第二个条件是((x+2)%8+1)没有便士或者(x+4)%8+1没有便士
思路
我们可以发现如果给出的便士是联通的那么我们一定能放7个便士.
所以问题就转化成判连通性的问题,因为长度为8那么我们可以直接找到一个端点,然后顺着遍历下去看看是不是一条链即可
void solve()
{
cin >> str;
str = " " + str;
sum = 0;
cnt = 0;
mp.clear();
for(int i = 1; i <= 8; i++)
{
if(str[i] == '1')
{
a[++cnt] = i;
mp[i] = 1;
}
}
if(cnt >= 7 || cnt <= 1)
{
puts("Yes");
return ;
}
for(int i = 1; i <= cnt; i++)
{
if(mp[(a[i] + 2) % 8 + 1] && mp[(a[i] + 4) % 8 + 1])
{
continue;
}
mp[a[i]] = 0;
ll num = 1;
ll x = a[i];
while(mp[(x + 2) % 8 + 1] || mp[(x + 4) % 8 + 1])
{
if(mp[(x + 2) % 8 + 1])
{
x = (x + 2) % 8 + 1;
num++;
}
else if(mp[(x + 4) % 8 + 1])
{
num++;
x = (x + 4) % 8 + 1;
}
mp[x]=0;
}
if(num == cnt)
{
puts("Yes");
return;
}
else
{
puts("No");
return;
}
}
puts("No");
}
标签:cnt,当前,河南省,位置,便士,2021,str,条件 来源: https://www.cnblogs.com/KingZhang/p/14832156.html