Luogu 2327 扫雷

题目链接:https://www.luogu.org/problem/P2327

思路:

设$f[i][j][k][l]$,$i$表示第$i$列,$j,k,l$取值为$0$或$1$,表示第$i-1$,$i$,$i+1$位是否有雷。

要初始化$1$号位的情况,输出时也要考虑$n$号位的答案。

简单易懂但是写起来繁琐的转移即可。

代码:

#include <bits/stdc++.h>
const int MAXN = 10050;
using namespace std;
int n, a[MAXN], f[MAXN][2][2][2];
int main() {
    cin >> n;
    for(int i = 1 ; i <= n; i++)
        cin >> a[i];
    if(a[1] == 0)
        f[1][0][0][0] = 1;
    else if(a[1] == 1) {
        f[1][0][1][0] = 1;
        f[1][0][0][1] = 1;
    }
    else if(a[1] == 2)
        f[1][0][1][1] = 1;
    for(int i = 2; i <= n; i++) {
        if(a[i] == 0)
            f[i][0][0][0] += f[i - 1][0][0][0] + f[i - 1][1][0][0];
        else if(a[i] == 1) {
            f[i][1][0][0] += f[i - 1][0][1][0] + f[i - 1][1][1][0];
            f[i][0][1][0] += f[i - 1][0][0][1] + f[i - 1][1][0][1];
            f[i][0][0][1] += f[i - 1][0][0][0] + f[i - 1][1][0][0];
        }
        else if(a[i] == 2) {
            f[i][1][1][0] += f[i - 1][0][1][1] + f[i - 1][1][1][1];
            f[i][1][0][1] += f[i - 1][0][1][0] + f[i - 1][1][1][0];
            f[i][0][1][1] += f[i - 1][0][0][1] + f[i - 1][1][0][1];
        }
        else
            f[i][1][1][1] += f[i - 1][0][1][1] + f[i - 1][1][1][1];
    }
    if(a[n] == 0)
        cout << f[n][0][0][0] << endl;
    else if(a[n] == 1)
        cout << f[n][1][0][0] + f[n][0][1][0] << endl;
    else if(a[n] == 2)
        cout << f[n][1][1][0] << endl;
    return 0;
}

 

posted @ 2019-10-09 16:08  BeyondLimits  阅读(273)  评论(0编辑  收藏  举报