扫雷

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


struct { int num;/* int num;/* 格子当前处于什么状态 格子当前处于什么状态 格子当前处于什么状态 格子当前处于什么状态 ,1 有, 有, 0已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 */ int roundnum;/* int roundnum;/* 统计格子周围有多少 统计格子周围有多少 统计格子周围有多少 统计格子周围有多少 统计格子周围有多少 */ int flag;/ int flag;/ *右键按下显示红旗的标志 右键按下显示红旗的标志 右键按下显示红旗的标志 右键按下显示红旗的标志 右键按下显示红旗的标志 ,0 没有红旗标志 没有红旗标志 没有红旗标志 没有红旗标志 ,1 有红旗标志 有红旗标志 */ }Mine[10][10]; int gameAGAIN=0;/* int gameAGAIN=0;/* 是否重来的变量 是否重来的变量 是否重来的变量 是否重来的变量 */ int gamePLAY=0;/* int gamePLAY=0;/* 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 */ int mineNUM;/* int mineNUM;/* 统计处理过的格子数 统计处理过的格子数 统计处理过的格子数 统计处理过的格子数 统计处理过的格子数 */ char randmineNUM[3];/* char randmineNUM[3];/* char randmineNUM[3];/* 显示数字的符串 显示数字的符串 显示数字的符串 显示数字的符串 */ int Keystate; int Keystate; int MouseExist; int MouseExist; int MouseButton; int MouseButton; int MouseX; int MouseX; int MouseY; int MouseY; void Init(void);/* void Init(void);/* 图形驱 图形驱 动*/ void MouseOn(void);/* void MouseOn(void);/* void MouseOn(void);/* 鼠标光显示 鼠标光显示 鼠标光显示 鼠标光显示 */ void MouseOff(void);/* void MouseOff(void);/* void MouseOff(void);/* 鼠标光隐藏 鼠标光隐藏 鼠标光隐藏 */ void MouseSetXY(int,int);/* void MouseSetXY(int,int);/* void MouseSetXY(int,int);/* void MouseSetXY(int,int);/* void MouseSetXY(int,int);/*设置 当前位设置 当前位设
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值