洛谷 P2327 [SCOI2005]扫雷

 

正文

题目描述

输入输出格式

输入格式:

 

第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

 

输出格式:

 

一个数,即第一列中雷的摆放方案数。

 

输入输出样例

输入样例#1:
2
1  1
输出样例#1:
2
算法1:
枚举左边每个位置是否有雷,复杂度O(2^n*n)。
算法2:
我们发现,当前两个位置确定时,后面的位置也就可以推出来了。
于是我们可以只枚举前两位。
复杂度O(n)
 
复制代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,num[10010],a[10010];
bool mine[10010],flag;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&num[i]);
    if(num[1]==3){printf("0");return 0;}
    if(num[1]==2){
        mine[1]=1;mine[2]=1;
        a[1]=2;
        for(int i=2;i<=n-1;i++){
            for(int j=i-1;j<=i+1;j++)a[i]+=mine[j];
            if(a[i]==num[i])mine[i+1]=0;
            else if(a[i]==num[i]-1)a[i]++,mine[i+1]=1;
            else {flag=1;break;}
        }
        if(flag==1){printf("0");return 0;}
        a[n]+=mine[n-1];a[n]+=mine[n];
        if(a[n]==num[n]){printf("1");return 0;}
        else{printf("0");return 0;}
    }
    if(num[1]==1){
        int ans=0;
        mine[1]=1;mine[2]=0;
        a[1]=1;
        for(int i=2;i<=n-1;i++){
            for(int j=i-1;j<=i+1;j++)a[i]+=mine[j];
            if(a[i]==num[i])mine[i+1]=0;
            else if(a[i]==num[i]-1)a[i]++,mine[i+1]=1;
            else {flag=1;break;}
        }
        if(flag!=1){a[n]+=mine[n-1];a[n]+=mine[n];if(a[n]==num[n])ans++;}
        
        memset(mine,0,sizeof(mine));
        memset(a,0,sizeof(a));
        mine[1]=0;mine[2]=1;
        a[1]=1;
        for(int i=2;i<=n-1;i++){
            for(int j=i-1;j<=i+1;j++)a[i]+=mine[j];
            if(a[i]==num[i])mine[i+1]=0;
            else if(a[i]==num[i]-1)a[i]++,mine[i+1]=1;
            else {flag=1;break;}
        }
        if(flag!=1){a[n]+=mine[n-1];a[n]+=mine[n];if(a[n]==num[n])ans++;}
        printf("%d",ans);return 0;
    }
    if(num[1]==0){
        mine[1]=0;mine[2]=0;
        a[1]=0;
        for(int i=2;i<=n-1;i++){
            for(int j=i-1;j<=i+1;j++)a[i]+=mine[j];
            if(a[i]==num[i])mine[i+1]=0;
            else if(a[i]==num[i]-1)a[i]++,mine[i+1]=1;
            else {flag=1;break;}
        }
        if(flag==1){printf("0");return 0;}
        a[n]+=mine[n-1];a[n]+=mine[n];
        if(a[n]==num[n]){printf("1");return 0;}
        else{printf("0");return 0;}
    }
}
复制代码
posted @   Echo宝贝儿  阅读(182)  评论(0编辑  收藏  举报
编辑推荐:
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· C# 深度学习框架 TorchSharp 原生训练模型和图像识别
阅读排行:
· 这或许是全网最全的 DeepSeek 使用指南,95% 的人都不知道的使用技巧(建议收藏)
· 拒绝繁忙!免费使用 deepseek-r1:671B 参数满血模型
· 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)
· Sdcb Chats 重磅更新:深度集成 DeepSeek-R1,思维链让 AI 更透明!
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
点击右上角即可分享
微信分享提示