BZOJ 1088 扫雷Mine (递推)

Description

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

【并没有的图……】

由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放
方案。


Input

第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

Output

一个数,即第一列中雷的摆放方案数。


Sample Input

2
1 1

Sample Output

2

题解

首先,明确一点,一个数字表示的是当前位置附近三个格子的雷数在这里插入图片描述
比如第二格中的num表示周围三个绿色雷区中雷的总数

那么,当我们知道三个格子中的总雷数后,如果其中两个格子中是否有雷已经知道,那么第三个格子中是否有雷可以直接推出来

现在还有个已知条件——第零个格子中是没有雷的,之所以是第零个,是因为这个格子本身不存在,是我们想象出来的。

在这里插入图片描述

那么如果我们已经知道第一个格子中是否有雷,那么第二个格子中是否有雷可以直接推出来

那么,已知1,2格,又可以推第3格,已知2,3,可以推3,4……一直到n

所以现在的问题就是第一格中到底有没有雷,所以我们可以枚举第一格……( a [ 1 ] = 1 或 a [ 1 ] = 0 a[1]=1或a[1]=0 a[1]=1a[1]=0),然后一直推下去看看是否合法即可

code

#include <cstdio>
int a[10010], f[10010];
int n, ans;

int judge () {
    for (int i = 1;i <= n; ++ i) {
        if (a[i - 1] + a[i] > f[i]) return 0;
        if (a[i - 1] + a[i] < f[i] - 1) return 0;
        if (a[i - 1] + a[i] == f[i]) a[i + 1] = 0;
        else a[i + 1] = 1;
    }
    return f[n] == (a[n - 1] + a[n]);
}

int main () {
    scanf ("%d", &n);

    for (int i = 1;i <= n; ++i) {
        scanf ("%d", &f[i]);
    }

    a[1] = 0; ans += judge();
    a[1] = 1; ans += judge();

    printf ("%d\n", ans);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值