(dfs/dp)P2327 [SCOI2005]扫雷

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

简化版扫雷,只有两列,已知第二列的数字求第一列的炸弹排序可能数
直接假设第一行的元素个数0/1,然后向下回溯搜索

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
typedef long long ll;

int a[maxn], bmb[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    int ans = 0;
    function<void(int)> dfs = [&](int now) {
        int sum = 0;
        if(bmb[now]) sum++;
        if(bmb[now - 1]) sum++;
        if(sum == a[now] - 1) {
            if(now + 1 > n) return;
            bmb[now + 1] = 1;
            dfs(now + 1);
            bmb[now + 1] = 0;
            return;
        }
        if(sum != a[now]) return;
        if(now == n) {
            ans++;
            return;
        }
        dfs(now + 1);
    };
    bmb[1] = 1;
    dfs(1);
    memset(bmb, 0, n * sizeof(bmb[0]));
    dfs(1);
    cout << ans << endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_40588429/article/details/84562890