Hdu OJ 5965 扫雷(递推)

时间:2023-03-08 22:35:56
Hdu OJ 5965 扫雷(递推)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5965

题目大意:中文题,自己读

解图思路:对于每一列都有三种情况--0, 1, 2。 如果第一列确定地雷的数量, 那么下一列地雷的数量为已知的, 同理可以求出剩下所有列地雷的数量。需要注意, 对于1的情况, 有0,1和1,0两种, 所以需要乘以2

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N = , mod = 1e8+; char str[N];
int dp[N], num[N]; void solve()
{
scanf("%s", str);
for(int i=; str[i]; ++ i)
num[i+] = str[i] - ''; int len = strlen(str);
memset(dp, , sizeof(dp)); int ans = ;
for(int i=; i<=num[] && i<; ++ i)
{
dp[] = i;
bool is = true;
for(int j=; j<=len; ++ j)
{
dp[j] = num[j-] - dp[j-] - dp[j-];
if(dp[j] > || dp[j] < )
{
is = false;
break;
}
}
if(is == false)
continue;
if(dp[len] + dp[len-] != num[len])
continue; int res = ;
for(int j=; j<=len; ++ j)
{
if(dp[j] == )
res = (res * ) % mod;
}
ans = (ans + res) % mod;
}
printf("%d\n", ans);
}
int main()
{
int t;
scanf("%d", &t);
for(int i=; i<=t; ++ i)
solve();
return ;
}