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 }