题解:CF2147C Rabbits
Lucas_Fan_2013 · · 题解
思路
提供一种朴素的做法。
考虑兔子不跳跃的情况。
(
情况一:21(同理,12)
情况二:201(同理,102)
所以,一只兔子如果不跳跃,那么它处于以下状态之一:
-
必须向左看(不能向相反的方向看)
-
必须向右看(同上)
-
可以向左看或可以向右看
其中,状态
我们可以从左往右扫,每次遇到是兔子就依次判断是否满足状态
状态
编号为
AC Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10;
int t;
int n;
char a[N];
int zt[N]; // 每个兔子的状态,其中0表示不是兔子
signed main(){
cin>>t;
while (t--){
cin>>n;
bool f=true;
for (int i=1;i<=n;i++) cin>>a[i],zt[i]=0;
zt[1]=3,zt[n]=3,a[n+1]=0,a[0]=0;
for (int i=2;i<n;i++){
if (a[i]=='1') continue;
if (a[i-1]=='0') zt[i]=3;
else if (a[i+1]=='0') zt[i]=3;
else if (a[i-2]=='0' and zt[i-2]!=1){
if (zt[i-2]==3) zt[i]=3;
else zt[i]=1;
}
else if (a[i+2]=='0') zt[i]=2,zt[i+2]=1;
}
for (int i=2;i<n;i++) if (a[i]=='0' and zt[i]==0){f=false;break;}
if (f==true) cout<<"YES";
else cout<<"NO";
cout<<"\n";
fflush(stdout);
}
return 0;
}