NC20241 [SCOI2005]扫雷MINE
题目
题目描述
相信大家都玩过扫雷的游戏。那是在一个 的矩阵里面有一些雷,要你根据一些信息找出雷来。
万圣节到了 ,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字 表示和它 连通的格子里面雷的数目。
现在棋盘是 的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。
输入描述
第一行为 ,第二行有 个数,依次为第二列的格子中的数。()
输出描述
一个数,即第一列中雷的摆放方案数。
示例1
输入
2 1 1
输出
2
题解
知识点:枚举,递推。
注意到只有两列一列无雷,一列有雷,不妨假设 列无雷, 列有雷, 为1则 处有雷; 为0则 处无雷 。
不妨假设 ,就可以通过 确定 ,之后遍历 通过 得到 。
如果某次 或者 或者 ,说明这种可能不可行,否则就完成了一种可能。
同理 情况模拟一次,累加可能数即可得到最后答案。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; int a[100007]; bool b[100007]; bool check(int n){ for(int i = 1;i<=n-1;i++){///最后一个点是确定的不需要再遍历,直接最后判断 int tmp = a[i] - b[i] - b[i-1];///当前a的某点还要的雷 if(tmp<0 || tmp>1) return 0; else b[i+1] = tmp; } if(b[n]+b[n-1] == a[n]) return 1; else return 0; } int main() { std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n; cin>>n; for(int i = 1; i<=n; i++) { cin>>a[i]; } int ans = 0; b[1] = 0; if(check(n)) ans++; b[1] = 1; if(check(n)) ans++; cout<<ans<<'\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16249865.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧