hdu 5965 扫雷

题意:三行n列的棋盘,给出第二列的每个格子的雷数a[i](代表周围八个格子的地雷数量,中间那一行肯定没地雷),问有多少种放雷方案

思路:每一列只能放0,1,2,我们对于第一列进行枚举,dp[i]代表每一列雷数目,所以dp[2]=a[1]-dp[1],dp[3]=a[2]-dp[1]-dp[2]...所以每一列是确定的

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll mod=1e8+7;
 5 
 6 int a[10004];
 7 int dp[10004];
 8 int n;
 9 
10 ll hh(int x){
11     memset(dp,0,sizeof(dp));
12     dp[1]=x;
13     dp[2]=a[1]-dp[1];
14     if(dp[2]<0||dp[2]>2) return 0;
15     for(int i=3;i<=n;i++){
16         dp[i]=a[i-1]-dp[i-1]-dp[i-2];
17         if(dp[i]<0||dp[i]>2) return 0;
18     }
19     if((dp[n-1]+dp[n])!=a[n]) return 0;
20     ll s=1;
21     for(int i=1;i<=n;i++){
22         if(dp[i]==1) s=s*2%mod;
23     }
24     return s;
25 }
26 char s[10002];
27 int main(){
28     int t;
29     cin>>t;
30     while(t--){
31         scanf("%s",s+1);
32         n=strlen(s+1);
33         for(int i=1;i<=n;i++) {
34             a[i]=s[i]-'0';
35         }
36         ll sum=0;
37         for(int i=0;i<3;i++)
38             sum=(sum+hh(i))%mod;
39         printf("%lld\n",sum);
40     }
41     return 0;
42 }

 

posted on 2017-09-28 16:09  hhhhx  阅读(154)  评论(0编辑  收藏  举报

导航