扫雷

来源:互联网 发布:编程 开发 编辑:程序博客网 时间:2024/06/08 04:15
扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔。 
该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷。 游戏中,格子可能处于己知和未知的状态。如果一个己知的格子中没有地雷,那么该 格子上会写有一个一位数,表示与这个格子八连通相邻的格子中地雷总的数量。 
现在,晨晨和小璐在一个3行N列(均从1开始用连续正整数编号)的矩阵中进 行游戏,在这个矩阵中,第2行的格子全部是己知的,并且其中均没有地雷;而另外 两行中是未知的,并且其中的地雷总数量也是未知的。 
晨晨和小璐想知道,第1行和第3行有多少种合法的埋放地雷的方案。
Input
包含多组测试数据,第一行一个正整数T,表示数据组数。 
每组数据由一行仅由数字组成的长度为N的非空字符串组成,表示矩阵有3行N 列,字符串的第i个数字字符表示矩阵中第2行第i个格子中的数字。 
保证字符串长度N <= 10000,数据组数<= 100。 
Output
每行仅一个数字,表示安放地雷的方案数mod100,000,007的结果。
Sample Input
222000
Sample Output
6

1

模拟:将第一列地雷数量情况枚举,(只有0,1,2三种情况),然后就可以推出后面的炸弹数量,从而得出一个结果,最后判断是否成立即可

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[10001];char str[10001];const int mod=100000007;int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%s",str);        n=strlen(str);        int i,j,k;        for(i=0; i<n; i++)            a[i+1]=str[i]-'0';        int ans=0;        for(j=0; j<=2; j++)        {            int p=1;            if(j==1)                p=2;            int d=a[1]-j,t=j;//t表示前一列放的炸弹数,d表示后一列放的炸弹数            for(i=2; i<=n; i++)            {                if(d<0||d>2)                    break;                if(d==1)                    p=(p*2)%mod;                int tt=t;                t=d;                d=a[i]-d-tt;//根据前一列和后一列的炸弹数,算出 后一列的后一列 的炸弹数            }            if(i==n+1&&d==0)                ans=(ans+p)%mod;        }        printf("%d\n",ans);    }    return 0;}