题意简述
在一个2行n(n≤104)列的扫雷棋盘中,仅在第一行存在雷。给出第二行的标数情况,求可能的方案数。
分析
记第一行的雷分布情况为ai,第二行的标数情况为bi,则有ai=bi−1−ai−2−ai−1。又因为bi是钦定的,所以只要确定a1和a2就能确定第一行的情况了。
实现
根据b1确定a1和a2,再判断ai是不是属于{0,1}即可。
代码
#include <cstdio>
int const N=1e4+10;
int n,x[N]; int a[N];
int check()
{
for(int i=2;i<=n-1;i++)
{
a[i+1]=x[i]-a[i-1]-a[i];
if(a[i+1]!=0 && a[i+1]!=1) return 0;
}
if(a[n-1]+a[n]==x[n]) return 1;
else return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&x[i]);
if(x[1]==0) a[1]=0,a[2]=0;
else if(x[1]==1) a[1]=1,a[2]=0;
else if(x[1]==2) a[1]=1,a[2]=1;
int ans=check();
if(x[1]==1) a[1]=0,a[2]=1,ans+=check();
printf("%d\n",ans);
return 0;
}
注意
bn需要特判一下。