给定一个一维矩阵,其中包含‘1’、‘2’、‘0’、‘*’、‘?’,扫雷小游戏——1表示左右有一个雷,2表示左右都有雷,0表示左右都没有雷,*表示雷,?表示未知,求其中有多少种可能的情况,若该图自相矛盾也输出0
表示档期位置为L,当前位置若是雷则为1,否则为0,下一位置若是雷则为1,否为0
递推时需要判断:根据不同情况分类讨论
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+5;
const long long MOD=1e9+7;
char s[MAX];
int L;
long long dp[MAX][2][2];
int main()
{
while(~scanf("%s",s+1))
{
memset(dp,0,sizeof(dp));
L=strlen(s+1);dp[0][0][0]=dp[0][0][1]=1;
for(int i=1;i<=L;++i)
{
if(s[i]=='0')
{
dp[i][0][0]=dp[i-1][0][0];
}
else if(s[i]=='1')
{
dp[i][0][1]=dp[i-1][0][0];
dp[i][0][0]=dp[i-1][1][0];
}
else if(s[i]=='2')
{
dp[i][0][1]=dp[i-1][1][0];
}
else if(s[i]=='*')
{
dp[i][1][0]=(dp[i-1][1][1]+dp[i-1][0][1])%MOD;
dp[i][1][1]=dp[i][1][0];
}
else
{
dp[i][0][0]=(dp[i-1][1][0]+dp[i-1][0][0])%MOD;
dp[i][0][1]=dp[i][0][0];
dp[i][1][0]=(dp[i-1][0][1]+dp[i-1][1][1])%MOD;
dp[i][1][1]=dp[i][1][0];
}
}
long long ans=0;
if(s[L]=='0') ans=dp[L-1][0][0];
else if(s[L]=='1') ans=dp[L-1][1][0];
else if(s[L]=='2') ans=0;
else if(s[L]=='*') ans=(dp[L-1][0][1]+dp[L-1][1][1])%MOD;
else ans=(dp[L-1][0][0]+dp[L-1][1][0]+dp[L-1][0][1]+dp[L-1][1][1])%MOD;
printf("%lld\n",ans);
}
return 0;
}