题目:现在有n*2的扫雷棋盘(当一个位置没有雷的时候将会出现对应周围8个位置的雷数),输入N,及第二列N个数(第二列全部都不是雷),问:有几种方案能使埋第一列雷的方式成立
思路:设雷为mine[],有雷时数值为0,没雷时数值为1,给出的数为a[],找到递推关系mine[i-1]+mine[i]+mine[i+1]=a[i],当i=0的时候mine[0]+mine[1]=a[0]这样的话确定第一个位置有没有雷的时候就能确定第二个雷的情况,确定前两个雷的情况后就能确定全部雷的情况了。接下来就枚举直接看递推后的雷数值是否符合0或1,不符合就说明该方案不成立就行了
代码:

#include <iostream>

using namespace std;
int a[10010];
int mine[10010]= {0};
int main()
{
    int n;
    cin>>n;
    int ans=0;
    for(int i=0; i<n; i++)cin>>a[i];
    for(int k=0; k<2; k++)//第一个位置只有填雷与不填雷两种情况
    {
        int i=0;
        mine[0]=k;
        mine[1]=a[0]-mine[0];
        if(mine[1]<0||mine[1]>1)continue;//开头特判
        int ok=1;
        for(i=1; i<n-1; i++)
        {
            mine[i+1]=a[i]-mine[i]-mine[i-1];
            if(mine[i+1]<0||mine[i+1]>1)ok=0;
        }
        if(mine[i]+mine[i-1]!=a[i])ok=0;//结尾记得也要特判
        if(ok){
                ans++;
        }
    }
    cout<<ans;
    return 0;
}