http://www.lydsy.com/JudgeOnline/problem.php?id=1088

2*N的扫雷棋盘,第二列的值a[i]记录第 i 个格子和它8连通的格子里面雷的数目。

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

设第一列的值为b[i],不难得出以下递推关系

b[0] + b[1] = a[0]

b[0] + b[1] + b[2] = a[1]

...

b[i] = a[i-1] - a[i-2] + b[i-3]
或 b[i] = a[i-1] - b[i-1] - b[i-2]

由此发现,b[0]、b[1]确定了,后续的b[i]也由递推式唯一的确定了。而又有b[0]+b[1] = a[0]的限制条件,故可根据a[0]的值枚举b[0], b[1]的组合,然后顺次求出b[i], 判断每个b[i]值是否合法,一旦发现不合法,则此种枚举情况不成立。

程序流程图如下(这里的“合法”判断与具体位置有关,如a[0], a[n-1] <3, a[n-1] == b[n-1] + b[n-2]):

代码如下(为了直观表达流程图,用了goto语句):

  1. #include <cstdio>
  2. using namespace std;
  3.  
  4. int n;
  5. int a[];
  6. int b[];
  7.  
  8. int main()
  9. {
  10. scanf("%d", &n);
  11. for(int i=; i<n; i++){
  12. scanf("%d", &a[i]);
  13. }
  14. int cnt = ;
  15.  
  16. for(int i=; i<n; i++){ //非法
  17. if(a[i]< || a[i]>){
  18. goto L;
  19. }
  20. }
  21. if(a[n-]== || a[] == ){ //非法
  22. goto L;
  23. }
  24.  
  25. if(a[] == ) b[] = b[] = ;
  26. else if(a[] == ) b[] = b[] = ;
  27.  
  28. if(a[] == ) goto B;
  29.  
  30. b[] = a[] - a[]; //0或2的情况
  31. if(b[] < || b[] > ){
  32. goto L;
  33. }
  34. for(int i=; i<n; i++){
  35. b[i] = a[i-] - a[i-] + b[i-];
  36. if(b[i] < || b[i] > ){
  37. goto L;
  38. }
  39. }
  40. if(b[n-] + b[n-] != a[n-]) //检查最后一个a
  41. goto L;
  42. printf("1\n");
  43. return ;
  44.  
  45. B: b[] = ; b[] = ; //01或10的情况
  46. b[] = a[] - a[];
  47. if(b[] < || b[] > ){
  48. goto L1;
  49. }
  50. for(int i=; i<n; i++){
  51. b[i] = a[i-] - a[i-] + b[i-];
  52. if(b[i] < || b[i] > ){
  53. goto L1;
  54. }
  55. }
  56. if(b[n-] + b[n-] != a[n-])
  57. goto L1;
  58. cnt++;
  59.  
  60. L1: b[] = ; b[] = ; //试探另一种
  61. b[] = a[] - a[];
  62. if(b[] < || b[] > ){
  63. goto L;
  64. }
  65. for(int i=; i<n; i++){
  66. b[i] = a[i-] - a[i-] + b[i-];
  67. if(b[i] < || b[i] > ){
  68. goto L;
  69. }
  70. }
  71. if(b[n-] + b[n-] != a[n-])
  72. goto L;
  73. cnt++;
  74.  
  75. L: printf("%d\n", cnt);
  76. return ;
  77.  
  78. }

BZOJ 1088

【BZOJ 1088 扫雷Mine】模拟的更多相关文章

  1. BZOJ 1088 扫雷Mine

    今天做了几道BZOJ的题,发现统观题目时还是很多很多都不会的,不过还是有几道时可以作的,以后要慢慢加强,争取多做题 BZOJ 1088 扫雷 其实本人平常不大玩扫雷的,就算玩也不是很好,不过看n*2的 ...

  2. BZOJ 1088 扫雷Mine 枚举初始状态

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1088 题目大意: 现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: ...

  3. BZOJ 1088 扫雷Mine (递推)

    题解:如果确定了第一排前两个数,那么剩下的数是唯一确定的,所以只要分情况讨论即可. #include <cstdio> #include <cstring> int n,a[1 ...

  4. BZOJ 1088: [SCOI2005]扫雷Mine【思维题,神奇的模拟+枚举】

    1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3791  Solved: 2234[Submit][St ...

  5. Bzoj 1088: [SCOI2005]扫雷Mine (DP)

    Bzoj 1088: [SCOI2005]扫雷Mine 怒写一发,算不上DP的游戏题 知道了前\(i-1\)项,第\(i\)项会被第二列的第\(i-1\)得知 设\(f[i]\)为第一列的第\(i\) ...

  6. 【递推】BZOJ 1088: [SCOI2005]扫雷Mine

    1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2275  Solved: 1328[Submit][St ...

  7. 【BZOJ】1088: [SCOI2005]扫雷Mine

    1088: [SCOI2005]扫雷Mine Description 相 信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的 ...

  8. bzoj 1088: [SCOI2005]扫雷Mine

    题目链接 1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2525  Solved: 1495[Submi ...

  9. 1088: [SCOI2005]扫雷Mine

    1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 979[Submit][Sta ...

随机推荐

  1. UESTC_秋实大哥与花 2015 UESTC Training for Data Structures<Problem B>

    B - 秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. N-Queens II 解答

    Question Follow up for N-Queens problem. Now, instead outputting board configurations, return the to ...

  3. 剑指offer-面试题13.在O(1)时间删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next ...

  4. Struts2(五)——核心拦截器

    Struts框架一共为我们提供了35个拦截器,其中默认的拦截器有18个,框架访问action的异常处理,配置信息处理,转发重定向选择,上传等等等等,都是这18个拦截器中设置的,起着非比寻常的作用.而这 ...

  5. Error 'Cannot add or update a child row: a foreign key constraint fails故障解决

    一大早的,某从库突然报出故障:SQL线程中断! 查看从库状态: mysql> show slave status\G Slave_IO_State: Waiting for master to ...

  6. Oracle SQL函数之日期函数

    sysdate [功能]:返回当前日期. [参数]:没有参数,没有括号 [返回]:日期 SQL> SELECT SYSDATE FROM DUAL; SYSDATE ----------- // ...

  7. 使用SignalR和SQLTableDependency跟踪数据库中记录的变动

    原文地址:查看 SqlTableDependency是一个组件用来接收数据库的通知,包含在数据表上该记录的值的Inserted.Deleted或者Update操作. 备注:原文提供示例代码下载,但是j ...

  8. Remove Duplicate Letters

    316. Remove Duplicate Letters Total Accepted: 2367 Total Submissions: 12388 Difficulty: Medium Given ...

  9. node.js 入门(一)安装

    从 https://nodejs.org/ 下载最新版的node.js 下载完成后,双击安装, 一路点击"Next"按钮即可. 等出现上图及表示安装成功. 按"win+r ...

  10. Citrix 服务器虚拟化之十一 Xenserver管理vApps

    Citrix 服务器虚拟化之十一  Xenserver管理vApps vApps是把几个业务相关的虚拟机作为一个单一实体管理,把vApps中的虚拟机的称为Application.启动vApps时其中包 ...