HDU 5965 扫雷

来源:互联网 发布:c语言中 x是什么意思 编辑:程序博客网 时间:2024/06/15 20:31

题目链接:点击打开链接

题意:一个3*n的矩阵,中间一行为数字(该点周围八个方向的雷数),中间一行没有雷,求有多少种摆放雷的方法。

个人理解:枚举第一列的雷数,然后来推其他列的

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char s[10022];int dp[10022];    //记录每个i下的可行方案数int num[10022];   //存储第二行显示的雷数int b[10022];     //每列的雷数int main(){    int t;    cin>>t;    while(t--)    {        cin>>s;        int l=strlen(s);        memset(dp,0,sizeof(dp));        for(int i=0;i<l;i++)        {            num[i+1]=s[i]-'0';        }        long long ans=0;        for(int i=0;i<=min(num[1],2);i++)        {            dp[1]=(i==1?2:1);                       //第一列的情况,如果i==1,则有两种方案,否则为一种            b[1]=i;            int flag=1;            for(int j=2;j<=l;j++)            {                int dis=num[j-1]-b[j-2]-b[j-1];    //第j列的雷数                if(dis==0||dis==2)                    dp[j]=dp[j-1];                else if(dis==1)                    dp[j]=dp[j-1]*2%100000007;                else                                //dis如果为负,则此方案错误,退出j的循环,开始下一次i的循环                {                    flag=0;                    break;                }                b[j]=dis;            }            if(flag&&b[l]+b[l-1]==num[l])                ans+=dp[l];        }        cout<<ans%100000007<<endl;    }    return 0;}


原创粉丝点击