PS:如果读过题了可以跳过题目描述直接到题解部分

提交链接:洛谷 P2327 [SCOI2005]扫雷

题目

题目描述

相信大家都玩过扫雷的游戏。那是在一个 n*m 的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是 n*2 的,第一列里面某些格子是雷,而第二列没有雷,如下图:

由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。

输入格式

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

输出格式

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

样例

样例输入

2
1  1

样例输出

2

题解

这道题因为数据范围也比较小,所以我们可以考虑用dp。(这道题的代码里面dp数组是数组b,是当时写的时候修修改改,最后就干脆的没改数组名了)

看到这道题的时候,因为平时也没少玩扫雷,就想用平时玩扫雷的思路做,就从能确定的地方入手,然后对旁边的产生影响,再更新旁边的,最后再把剩下没有办法确定的地方dfs。后来发现这样可能能做吧(我也不知道,反正后来总有不太对的地方),但代码很复杂。而且是冗长。

最后,还剩了半个小时的时候我决定把所有的“优化”想法放掉,直接dp,没想到过了。

这道题的dp思路其实很简单。

就用一个数组 b[i][j] 表示第 i 行左边三个的状态 j (这个地方需要用一下状态压缩),每行对左边的三个格子中雷的数量进行判断比较,情况数累加即可。

注意:输入里面会出现 0 的情况,这是跟我们平时玩的扫雷所不一样的(我就在这里错过)

代码实现

//洛谷 P2327 [SCOI2005]扫雷
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int b[10010][10];
int ans;
int a[10010];int main(){scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);}for(int i=0;i<=3;++i){int x=(i>>1)+(i&1);if(x!=a[1]){continue;}++b[1][i];}for(int i=2;i<n;++i){for(int j=0;j<=7;++j){if(!b[i-1][j]){continue;}int k=j&3;int x=(k>>1)+(k&1);k<<=1;if(x>a[i]){continue;}else if(x==a[i]){b[i][k]+=b[i-1][j];}else if(x+1==a[i]){k+=1;b[i][k]+=b[i-1][j];}}}for(int j=0;j<=7;++j){if(!b[n-1][j]){continue;}int k=j&3;int x=(k>>1)+(k&1);if(x!=a[n]){continue;}ans+=b[n-1][j];}printf("%d",ans);return 0;
}

洛谷 P2327 [SCOI2005]扫雷相关推荐

  1. 洛谷 P2327 [SCOI2005] 扫雷

    题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输 ...

  2. 洛谷P2327 [SCOI2005]扫雷 [2017年5月计划 清北学堂51精英班Day1]

    P2327 [SCOI2005]扫雷 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一 ...

  3. 洛谷P2327 [SCOI2005]扫雷 题解

    [SCOI2005]扫雷 - 洛谷 description: 一个 的棋盘.已知右侧一列全部没有雷,且已知第 行相应的格子为 ,表示八联通的格子内共有 个雷.求左侧一列可能的雷的方案数. soluti ...

  4. 洛谷P2327 [SCOI2005]扫雷【DP】【黄】

    Date:2022.02.09 题目描述 相信大家都玩过扫雷的游戏.那是在一个n×m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏, ...

  5. 洛谷 P2327 [SCOI2005]扫雷 解题报告

    题目 题目分析 题目将扫雷游戏简化,改为只有一列有雷的版本 a[i] 表示第 i 格的数字 f[i][j][k]表示当前做到第 i 个位置,第 i 个位置的状态为 j(1表示无雷,2雷),第 i+1  ...

  6. 洛谷P2327 [SCOI2005] 扫雷

    题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输 ...

  7. 信息学奥赛一本通 1392:繁忙的都市(city) | 洛谷 P2330 [SCOI2005]繁忙的都市

    [题目链接] ybt 1392:繁忙的都市(city) 洛谷 P2330 [SCOI2005]繁忙的都市 [题目考点] 1. 图论 最小生成树 [解题思路] 将题目叙述转为图论概念,交叉路口为顶点,道 ...

  8. [T][3]洛谷 P2331 [SCOI2005] 最大子矩阵

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  9. 洛谷 P2331 [SCOI2005]最大子矩阵

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P2331 [SCOI2005]最大子矩阵 题目 题目描述 这里有一个 n*m 的矩阵,请你选出其中 k 个子矩阵,使得这个 k 个子 ...

最新文章

  1. python培训Day1 随笔
  2. 重定向index.php,使用htaccess将all重定向到index.php
  3. 为了追到小姐姐,我用 Python 制作了一个机器人
  4. python之禅中文原文_Python之禅 - osc_ns45oss7的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 【转】ON_MESSAGE使用方法
  6. Android 8.0学习(27)--- SystemUI(二)启动流程和初始化
  7. 将mysql表数据拼接成oracle的insert语句
  8. 大疆等无人机在倾斜摄影作业时 如何进行仿地飞行
  9. iOS 项目中的NSNotification简单使用
  10. HackerRank - Stock Maximize
  11. 天堂2游戏登陆服务器源码分析1
  12. 跨境B2B电商市场血雨腥风,供应链管理系统成争夺焦点
  13. Django菜鸟入门
  14. Spring Boot 2.1.6.RELEASE embed tomcat启动过程
  15. 重磅 | 逆天操作,修图神器Photoshop,真的可以,完美移植到手机上了
  16. R | 导入excel文件乱码
  17. Python如何查询版本号
  18. 【Windows】清除指定文件类型的默认打开方式
  19. 基带信号及其眼图MATLAB仿真实现,Matlab通信仿真——带限系统下的基带信号
  20. react前端ui的使用_使用React Morph变形UI过渡

热门文章

  1. 2. Hadoop的安装(这你都没装好,我就服了)
  2. 蓝桥 星期一 JAVA
  3. SOYO的主板如何进入BIOS系统
  4. 你在小时候玩过哪些「恶心」的游戏?
  5. 搭建 Cobbler 无人值守安装服务器
  6. 面向对象分析与设计的底层逻辑
  7. java swing 自动补全_扩展easyui的combobox组件的自动完成(autocomplete)
  8. wps画流程图交叉弧形_WPS3分钟画出高逼格的流程图
  9. ucsd大学音乐计算机,音乐留学│综合名校UCSD音乐制作专业详解!
  10. unity 自动寻路NavMesh