bzoj 1088: [SCOI2005]扫雷Mine

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 int f[10009],a[10009],n,ans;
 6 bool pan()
 7 {
 8     for(int i=2;i<n;i++)
 9       {
10         f[i+1]=a[i]-f[i]-f[i-1];
11         if(f[i+1]<0)
12           return 0;
13       }
14     if(f[n]+f[n-1]!=a[n])
15       return 0;
16     return 1;
17 }
18 int main()
19 {
20     scanf("%d",&n);
21     for(int i=1;i<=n;i++)
22       scanf("%d",&a[i]);
23     if(!a[1])
24       ans+=pan();
25     else  if(a[1]==1)
26             {
27                 f[1]=1;
28                 ans+=pan();
29                 memset(f,0,sizeof(f));
30                 f[2]=1;
31                 ans+=pan();
32             }
33           else
34             {
35                 f[1]=1;
36                 f[2]=1;
37                 ans+=pan();
38             }
39     printf("%d\n",ans);
40     return 0;
41 }
42 

只要第一行第一格与第二格确定下来,整行就确定了。所以只要枚举后再判定即可。

你可能感兴趣的:(bzoj 1088: [SCOI2005]扫雷Mine)