欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PIPI玩扫雷

程序员文章站 2024-03-18 22:42:16
...

题目描述

现在PIPI在玩一个简单版的扫雷游戏,地图为一个N行2列的矩阵,左边列的格子都未打开,且格子只有两种情况:有地雷,无地雷(即空格子)。右边列的格子已经全部打开,且都为数字(只包含0,1,2,3),数字表示和它8连通的格子里面雷的数目,如下图例子所示。
PIPI玩扫雷
请你帮PIPI计算出左边列的雷可能有多种方案满足第二列的数的限制。

输入

第一行为一个整数N,N<=100000.
接下来N个数字,表示右边列格子中的数字。

输出

输出左边列合法的方案数。

样例输入

2
1 1

样例输出

2

思路:这题首先要知道当左边这列的第一个值确定时,整个左边这列的值就确定了,比如第一个值为0时,第二个值等于前一列右边的值减去左边一行和前一行的值,mp[i][0]=mp[i-1][1]-mp[i-1][0]-mp[i-2][0],其次就是左边的第一行不能为3,最后一行的值要验证,因为左边这列的最后一行的值是通过前n-1行确定的,所以最后要验证一下mp[n][0]+mp[n-1][0]!=mp[n][1]

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int mp[N][2],flag;
int main(){
    int n,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&mp[i][1]);
    }
    if(mp[1][1]==3){
        printf("0\n");
        return 0;
    }
    for(int j=0;j<2;j++){
        flag=0;
        mp[1][0]=j;
        for(int i=2;i<=n;i++){
            mp[i][0]=mp[i-1][1]-mp[i-1][0]-mp[i-2][0];
            //printf("%d%d%d",mp[i-1][1],mp[i-1][0],mp[i-2][0]);
            if(mp[i][0]==0||mp[i][0]==1)
                continue;
            else{
                flag=1;
                break;
            }
        }
        if(mp[n][0]+mp[n-1][0]!=mp[n][1]) flag=1;
        if(flag==0) ans++;
    }
    printf("%d\n",ans);
}
相关标签: oj刷题