一号坑

填坑……

1088: [SCOI2005]扫雷Mine

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 4115  Solved: 2444

[​​Submit​​​][​​Status​​​][​​Discuss​​]

Description

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

Input

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

Output

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

Sample Input

2
1 1

Sample Output

2

HINT

 

Source

由题目易知当前两个确定了,后面也就确定了 

1 #include "bits/stdc++.h"
2 using namespace std;
3 typedef long long LL;
4 const int MAX=1e4;
5 int n,ans;
6 int a[MAX],b[MAX];
7 inline int read(){
8 int an=0,x=1;char c=getchar();
9 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
10 while (c>='0' && c<='9') {an=(an<<3)+(an<<1)+c-'0';c=getchar();}
11 return an*x;
12 }
13 bool check(){
14 int i,j;
15 if (b[1]+b[2]!=a[1]) return false;
16 for (i=2;i<n;i++){
17 if (b[i]+b[i-1]>a[i] || b[i]+b[i-1]<a[i]-1) return false;
18 b[i+1]=a[i]-b[i]-b[i-1];
19 }
20 if (b[n-1]+b[n]!=a[n]) return false;
21 return true;
22 }
23 int main(){
24 freopen ("mine.in","r",stdin);freopen ("mine.out","w",stdout);
25 int i,j;
26 n=read();
27 for (i=1;i<=n;i++) a[i]=read();
28 b[1]=0,b[2]=0; if (check()) ans++;
29 b[1]=0,b[2]=1; if (check()) ans++;
30 b[1]=1,b[2]=0; if (check()) ans++;
31 b[1]=1,b[2]=1; if (check()) ans++;
32 printf("%d",ans);
33 return 0;
34