• 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;
    }
  • 相关阅读:
    我的大学学习之路
    拉勾上的一道题目
    python中文处理之encode/decode函数
    几个容易出错的css盒子模型细节
    洗牌算法shuffle
    判断正整数是否对称
    一种快速求fibonacci第n个数的算法
    利用正则表达式作为string.split seprator
    docker部分命令
    idea上传项目到GitHub
  • 原文地址:https://www.cnblogs.com/BeyondLimits/p/11642426.html
Copyright © 2020-2023  润新知