思路分析
- 此题采用dfs,注意X选中了之后所有的X值相同,所以需要一个flag来存储X的值。
- 注意前导0要单独讨论,然后就是当’X’或者’_'在第一位时不能选0,其它位可以选0 - 9 任意一个数。
代码如下
//now-当前位数 flag-X的值 num-当前数的大小
#include <bits/stdc++.h>
using namespace std;
string s;
int ans;
void dfs(int now, int flag, int num)
{
if (now == s.size())
{
if (num % 25 == 0)
{
ans++;
}
return;
}
if (s[now] != 'X' && s[now] != '_')
{
//如果当前位为数,那就dfs下一位
dfs(now + 1, flag, num * 10 + s[now] - '0');
}
else if (s[now] == 'X')
{
if (flag != -1)
dfs(now + 1, flag, num * 10 + flag);
//如果前面已经选好了X的值,那么加上这个值即可
else
{
int down = 0;
if (now == 0 && s.size() > 1)
down = 1;
for (int i = down; i <= 9; i++)
{
dfs(now + 1, i, num * 10 + i);
}
//第一次出现X,有两种情况,第一种是在第一位,那么只能选1-9,否则可以选0-9
}
}
else if (s[now] == '_')
{
int down = 0;
if (now == 0 && s.size() > 1)
{
down = 1;
}
for (int i = down; i <= 9; i++)
{
dfs(now + 1, flag, num * 10 + i);
}
//与X同理
}
}
int main()
{
cin >> s;
if (s[0] == '0' && s.size() > 1)
{
cout << 0 << endl;
return 0;
}
else
{
dfs(0, -1, 0);
cout << ans << endl;
return 0;
}
}