BZOJ1088 扫雷

水题,模拟。对于最后的方案数最多只会是2,想好久,又睡了一觉才想到这个,剩下的就好办了

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <vector>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 #define lson l,m,rt<<1
 8 #define rson m+1,r,rt<<1|1
 9 const int maxn = 10005;
10 int a[maxn],vis[maxn];
11 int n;
12 bool ok()
13 {
14     for(int i = 2;i<n;++i){
15         if(a[i]==1){
16             if(vis[i]==1&&vis[i-1]==1)return false;
17             if(vis[i]==1||vis[i-1]==1)vis[i+1] = 0;
18             else vis[i+1] = 1;
19         }
20         else if(a[i]==2){
21             if(vis[i]==0&&vis[i-1]==0)return false;
22             if((vis[i]==1&&vis[i-1]==0)||(vis[i]==0&&vis[i-1]==1))vis[i+1] = 1;
23             else vis[i+1] = 0;
24         }
25         else if(a[i]==3){
26             if(!(vis[i]==1&&vis[i-1]==1))return false;
27             vis[i+1] = 1;
28         }
29         else if(a[i]==0){
30             if(vis[i]||vis[i-1])return false;
31             vis[i+1] = 0;
32         }
33         else return false;
34     }
35     if(vis[n-1]+vis[n]==a[n])return true;
36     else return false;
37 }
38 int main()
39 {
40     //freopen("in.txt","r",stdin);
41     scanf("%d",&n);
42     for(int i = 1;i<=n;++i)scanf("%d",&a[i]);
43     if(n==1){
44         if(a[1]==1||a[1]==0)printf("1\n");
45         else printf("0\n");
46         return 0;
47     }
48     if(a[1]==3){printf("0\n");return 0;}
49     memset(vis,-1,sizeof(vis));
50     int ans = 0;
51     if(a[1]==2){
52         vis[1] = vis[2] = 1;
53         if(ok())ans++;
54     }
55     else if(a[1]==0){
56         vis[1] = vis[2] = 0;
57         if(ok())ans++;
58     }
59     else if(a[1]==1){
60         vis[1] = 1;vis[2] = 0;
61         if(ok())ans++;
62         memset(vis,-1,sizeof(vis));
63         vis[1] = 0;vis[2] = 1;
64         if(ok())ans++;
65     }
66     printf("%d\n",ans);
67     return 0;
68 }
时间: 2024-12-28 00:57:34

BZOJ1088 扫雷的相关文章

BZOJ1088扫雷Mine 解析报告

1088: [SCOI2005]扫雷Mine Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. Input 第一行为

bzoj1088扫雷(搜索)

1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3669  Solved: 2153[Submit][Status][Discuss] Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×

bzoj1088[SCOI2005]扫雷

bzoj1088[SCOI2005]扫雷 题意: 有一个n×2的棋盘,第一列里面某些格子是雷,而第二列没有雷.由于第一列的雷可能有多种方案满足第二列的信息的限制,求根据第二列的信息第一列雷有多少种摆放方案. 题解: 水题,因为每个第一行的格子可以根据前一个第二行的格子里的信息唯一确定是否有雷,所以只要枚举第一个格子有没有雷就行. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #

BZOJ1088 [SCOI2005]扫雷Mine

Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了 ,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字 表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放 方案. Input 第一行为N,第二行有N个数,依次为第二列的格子中

bzoj1088:[SCOI2005]扫雷Mine

题目描述 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. 输入 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<

扫雷(BZOJ1088) 题解

[问题描述] 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. [样例输入] 2    1 1 [样例输出] 2 [解题思路] 本题为SCO

bzoj1088: [SCOI2005]扫雷Mine(DP)

1088: [SCOI2005]扫雷Mine 题目:传送门 题解: 一道DP(玩过扫雷的资深玩家肯定一眼秒%%%) 其实定义一个F数组表示1~i的数目就OK. 前两个格子完全可以与处理出来,后面的for一次就搞定了 水了一题... 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #def

【题解】 bzoj1088: [SCOI2005]扫雷Mine (神奇的做法)

bzoj1088,懒得复制,戳我戳我 Solution: 其实这个有个结论,答案只会有\(0\),\(1\),\(2\)三种(我真的是个弱鸡,这个都想不到) 然后我们假设第一个就可以推出所有的状态(显然) 没了,and 我真的菜 Code: //It is coded by Ning_Mew on 5.6 #include<bits/stdc++.h> using namespace std; const int maxn=1e4+7; int n,a[maxn]; int ans=0; in

【暴力】【推导】bzoj1088 [SCOI2005]扫雷Mine

考虑右侧的一个格子是否放雷,只可能对其左侧的三个格子造成影响. 也就是说,若左侧一个格子旁的两个格子已经放了雷,对第三个格子也就唯一确定了. 因此只枚举前两个格子是否放雷,剩下的暴力判断是否合法即可. 但是再想想,左侧第一个格子只受右侧前两个格子的影响.所以只枚举右侧第一个格子是否放雷,剩下的判断是否合法即可. 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int n,a[10001],t[10001