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

1088: [SCOI2005]扫雷Mine

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2275  Solved: 1328
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

2
1 1

Sample Output

2

  世纪大水题。。
  然而我这个大蒟蒻还是偷看了一发题解。。
  只要确(mei)定(ju)第一个位置有没有雷就能知道推出整个序列
  然后就是判定问题了。。
  
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 
 6 using namespace std;
 7 
 8 inline int in()
 9 {
10     int x=0;char ch=getchar();
11     while(ch<'0'||ch>'9')ch=getchar();
12     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
13     return x;
14 }
15 
16 int a[10001],n;
17 
18 int jud(int f1)
19 {
20     int f2=a[1]-f1;
21     for(int i=2;i<n;i++)
22     {
23         int f3=a[i]-f1-f2;
24         if(f3==0||f3==1)
25         {
26             f1=f2;
27             f2=f3;
28         }
29         else return 0;
30     }
31     if(f1+f2!=a[n])return 0;
32     else return 1;
33 }
34 
35 int main()
36 {
37     int ans=0;
38     n=in();
39     for(int i=1;i<=n;i++)a[i]=in();
40     if(n==1&&(a[1]==0||a[1]==1)){printf("1");return 0;}
41     if(a[1]==0)ans+=jud(0);
42     else ans+=jud(0)+jud(1);
43     printf("%d",ans);
44     return 0;
45 }
View Code

  vfk:

  gg。。

posted @ 2015-10-14 22:23  puck_just_me  阅读(182)  评论(0编辑  收藏  举报