P2327 [SCOI2005]扫雷
Posted five20
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2327 [SCOI2005]扫雷相关的知识,希望对你有一定的参考价值。
题目描述
相信大家都玩过扫雷的游戏。那是在一个 n×mn\times mn×m 的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是 n×2n\times 2n×2 的,第一列里面某些格子是雷,而第二列没有雷,如下图:
由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。
输入输出格式
输入格式:第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
输出格式:一个数,即第一列中雷的摆放方案数。
输入输出样例
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 }
以上是关于P2327 [SCOI2005]扫雷的主要内容,如果未能解决你的问题,请参考以下文章