链接:https://ac.nowcoder.com/acm/problem/20241
来源:牛客网

题目描述

相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。
万圣节到了 ,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字 表示和它8连通的格子里面雷的数目。
现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。

思路:本题第一眼看上去好像一个区域是否有雷会受到许多数的影响。但仔细观察的话会发现在某一行是否有雷取决于是否将上一行的那个数满足。递推会发现这样每一行的数都将会是固定的。所以到底有几种方案就取决于第一行是否有雷,以及如果有或没有是否会满足题目上所给数据的要求。
递推规律为:b[i]=a[i-1]-b[i-1]-b[i-2]
代码:
#include <iostream>
#include <cstdio>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;
const int MAXN = 100002;
int a[MAXN];
int b[MAXN];
int n;
bool is_ok() {
    for (int i=2;i<=n;i++) {
        b[i] = a[i-1]-b[i-1]-b[i-2];
        if (b[i]!=0&&b[i]!=1) {
            return false;
        }
    }
    if (a[n]-b[n]-b[n-1]==0) {
        return true;
    }
    return false;
}

int main() {
    IOS;
    cin>>n;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
    }
    int ans = 0;
    b[1] = 0;
    if (is_ok()) {
        ans++;
    }
    b[1] = 1;
    if (is_ok()) {
        ans++;
    }
    cout<<ans;
    
    return 0;
}