hdu 5965 扫雷

Posted 早知如此绊人心,何如当初莫相识。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于hdu 5965 扫雷的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5965 扫雷 模拟 (中国大学生程序设计竞赛(合肥))

hdu 5965 扫雷

HDU 5965 扫雷

HDU 5965(三行扫雷 dp)

HDU 5965 枚举模拟 + dp(?)

hdu 1015 Safecracker