1. 程式人生 > >(dfs/dp)P2327 [SCOI2005]掃雷

(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;
}