P2327 [SCOI2005]扫雷

题目描述

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

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
复制

2
1  1

输出样例#1: 复制

2

Solution:

  本题其实就是个简单的模拟题,乱搞就好了。。。

  昨天晚上回寝快要迟到时,用了$5$分钟打了$80$个$if$水了$30$分。

  今天改成爆搜,结过$A$了。

  思路就是固定第一个位置为$0$或$1$(显然答案只有三种情况:$0,1,2$),其它位置按照要求去放置,当出现冲突时说明不行。

代码:

 1 // luogu-judger-enable-o2
 2 #include<bits/stdc++.h>
 3 #define il inline
 4 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
 5 using namespace std;
 6 const int N=10005,dx[3]={-1,0,1};
 7 int n,a[N],b[N],ans,c[N];
 8 bool f;
 9 il void dfs(int x,int k){
10     if(k==1){
11         b[k]=x;
12         int tot=a[1]-x;
13         if(tot<0||tot>1)return;
14         b[2]=tot;
15         dfs(x,k+1);
16     }
17     else if(k==n){
18         int tot=0;
19         if(b[n-1])tot++;
20         if(b[n])tot++;
21         tot=a[n]-tot;
22         if(tot<0||tot>1)return;
23         if(!tot){ans++;return;}
24     }
25     else {
26         int tot=0;
27         For(i,0,2){
28             int xx=dx[i]+k;
29             if(xx<=n&&b[xx])tot++;
30         }
31         tot=a[k]-tot;
32         if(tot<0||tot>1)return;
33         b[k+1]=tot;
34         dfs(x,k+1);
35     }
36 }
37 int main(){
38     ios::sync_with_stdio(0);
39     cin>>n;
40     For(i,1,n){
41         cin>>a[i];
42         if(a[i]>3){cout<<0;return 0;}
43     }
44     if(n==1){
45         if(a[1]==1||!a[1]){cout<<1;return 0;}
46         cout<<0;return 0;
47     }
48     dfs(1,1);
49     memset(b,0,sizeof(b));
50     dfs(0,1);
51     cout<<ans;
52     return 0;
53 }

原文地址:https://www.cnblogs.com/five20/p/9060654.html

时间: 2024-08-30 05:37:59

P2327 [SCOI2005]扫雷的相关文章

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

P2327 [SCOI2005]扫雷 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输入样例#1: 2 1 1 输出样例#1: 2 其实还是扫雷玩的少..知道思路之后很快 只需枚举前两个各自的情况,后面的各自便能够计算出来 注意几个细节(在代码里面) #include <iostream> #include <cstdio> #in

洛谷 P2327 [SCOI2005]扫雷

P2327 [SCOI2005]扫雷 https://www.luogu.org/problem/show?pid=2327 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输入样例#1: 2 1 1 输出样例#1: 2 算法1: 枚举左边每个位置是否有雷,复杂度O(2^n*n). 算法2: 我们发现,当前两个位置确定时,后面的位置也就可以推出来了. 于是我

洛谷P2327 [SCOI2005]扫雷 枚举 搜索

洛谷P2327 [SCOI2005]扫雷 枚举 搜索 对搜索的 一些优化 其实我们只要枚举第一行是否有地雷,根据第1行探测出的地雷数,就可以推出第二行是否有地雷 然后在根据第二行探测地雷数推出第三行的情况,这样以此类推,一直推到第 n-1 的探测结果,然后 推出第 n 行是否有地雷如果在推的过程中 使得当前的探测地雷数为 负数 ,说明这个方法是萎的, 或者这一行推完了之后,还是有雷,那也退出,最后还要判断一下第 n 行是否有地雷 1 #include <cstdio> 2 #include &

题解 P2327 [SCOI2005]扫雷

题解 P2327 [SCOI2005]扫雷 题目链接 普及组水题非常适合新手练搜索 看题解里各路神仙都用各种简单的方法,我来讲讲暴力搜索做法.... 对于我这样的萌新我觉得这样的做法更容易让你理解搜索 首先搜索要定义状态,我们定义dfs(x, p)是当第x位是p,就有了状态 然后我们讨论第x + 1位的情况只有两种情况,然后就有了转移 其次当x是n时,如果成立,则++ans,于是有了边界条件 最后你把这段代码复制粘贴得了100分,发现原来这有点像动态规划 #include <iostream>

Luogu P2327 [SCOI2005]扫雷【递推/数学】By cellur925

题目传送门 推了好久啊.看来以后要多玩扫雷了qwq. 其实本题只有三种答案:0.1.2. 对于所有第一列,只要第一个数和第二个数确定后,其实整个数列就确定了,我们可以通过这个递推式得出 1 sec[i-1]=fir[i]+fir[i-2]+fir[i-1] 所以我们可以枚举每列的第1/2个数. 如果推到第n+1个数还存在,那么指定这种情况不成立. Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring&

bzoj1088[SCOI2005]扫雷

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

1088: [SCOI2005]扫雷Mine

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

[BZOJ 1088][SCOI2005]扫雷Mine

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

[SCOI2005]扫雷Mine

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