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