考虑右侧的一个格子是否放雷,只可能对其左侧的三个格子造成影响。
也就是说,若左侧一个格子旁的两个格子已经放了雷,对第三个格子也就唯一确定了。
因此只枚举前两个格子是否放雷,剩下的暴力判断是否合法即可。
但是再想想,左侧第一个格子只受右侧前两个格子的影响。所以只枚举右侧第一个格子是否放雷,剩下的判断是否合法即可。
#include<cstdio>
#include<cstring>
using namespace std;
int n,a[],t[],ans;
bool b[];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
memcpy(t,a,sizeof(a));
b[]=; a[]--; a[]--;
for(int i=;i<=n;i++)
if(a[i-])
{
b[i]=; a[i-]--; a[i]--; a[i+]--;
if(a[i-]!=) goto FAIL;
}
if(a[n]!=||a[n-]!=) goto FAIL;
ans++;
FAIL: memset(b,,sizeof(b));
memcpy(a,t,sizeof(a));
for(int i=;i<=n;i++)
if(a[i-])
{
b[i]=; a[i-]--; a[i]--; a[i+]--;
if(a[i-]!=) goto FAIL2;
}
if(a[n]!=||a[n-]!=) goto FAIL2;
ans++;
FAIL2: printf("%d\n",ans);
return ;
}