hdu5965 2016CCPC

来源:互联网 发布:淘宝达人怎么修改昵称 编辑:程序博客网 时间:2024/06/02 02:39

传送门

题意:中文题

题解:在做这个题的时候的困难无非就是确定每一列上有多少个地雷,每一列上最多只有0,1,2三种情况。那么我们可以通过枚举第一列的情况,那么在第一列上有多少地雷我们已知的情况下,可以通过第一个数字确定第二列有多少地雷,然后可以通过第二列的数字和第一列第二列上地雷的数目确定第三列有多少地雷。全部统计下来,然后计算就可以了。

#include<bits/stdc++.h>using namespace std;const int maxn = 10005;const int mod = 1e8+7;char s[maxn];int num[maxn],dp[maxn];int main(){    int t;    scanf("%d",&t);    while (t--)    {        memset(s,0,sizeof s);        memset(num,0,sizeof num);        memset(dp,0,sizeof dp);        scanf("%s",s);        int len = strlen(s);        for (int i = 0; i < len ; i++)        {            num[i] = s[i] - '0';        }        int flag = 0;        int ans = 0,sum = 0;        for (int i = 0; i <= 2; i++)        {            if(i > num[0])break;            flag = 0,ans = 1;            dp[0] = i;            dp[1] = num[0] - dp[0];            if(dp[1] < 0 || dp[1] > 2)continue;            for (int j = 2; j < len; j++)            {                dp[j] = num[j - 1] - dp[j - 1] - dp[j - 2];                if(dp[j] < 0||dp[j] > 2)                {                    flag = 1;                    break;                }            }            if(dp[len - 1] < 0||dp[len - 2] + dp[len - 1] != num[len - 1]||dp[len - 1] > 2)flag = 1;            if(flag) continue;            if(ans == 0)ans = 1;            for (int j = 0; j < len; j++)            {                if (dp[j] == 1)                {                    ans *= 2;                }                ans %= mod;            }            sum = (ans + sum)%mod;        }        printf("%d\n",sum);    }}
原创粉丝点击