一个合法的号码是由 0−9 组成的四位数字字符串,可以是 0 开头。
粗心的火焰车忘掉了他的号码,只记得有这样一个字符串,是用来描述他的号码的:
字符串长度为 10, 10 10 个字符分别为 S 0 , S 1 , ,S 2 ,…,S 9 表示:
如果 S i 是 o,则号码中一定包括数字 i 如果 S i 是 x,则号码中一定不包含数字 i 如果 S i 是 ?,则不确定号码中是否包含数字 i 输出符合条件的号码数量。
输入:ooo???xxxx
输出:108
输入:o?xxxxxxxx
输出:15
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=15;
int ans,cnt;
string s;
bool f1[N],f2[N];
signed main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='o')
{
cnt++;
f1[i]=1;
f2[i]=1;
}
else if(s[i]=='?')
{
f2[i]=1;
}
}
for(int i=0;i<=9;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
for(int z=0;z<=9;z++)
{
if(cnt==3)
{
if(f2[i])
{
if(f1[j] && f1[k] && f1[z] && j!=k && k!=z && z!=j)
{
ans++;
// cout<<i<<j<<k<<z<<endl;
}
}
else if(f2[j])
{
if(f1[i] && f1[k] && f1[z] && i!=k && k!=z && z!=i)
{
ans++;
//cout<<i<<j<<k<<z<<endl;
}
}
else if(f2[k])
{
if(f1[i] && f1[j] && f1[z] && i!=j && j!=z && z!=i){
ans++;
//cout<<i<<j<<k<<z<<endl;
}
}
else if(f2[z])
{
if(f1[i] && f1[j] && f1[k] && i!=j && j!=k && k!=i)
{
ans++;
// cout<<i<<j<<k<<z<<endl;
}
}
}else if(cnt==2){
if(f2[i] && f2[j])
{
if(f1[k] && f1[z] && k!=z ) ans++;
}
else if(f2[i] && f2[k])
{
if(f1[j] && f1[z] && z!=j) ans++;
}
else if(f2[i] && f2[z])
{
if(f1[j] && f1[k] && k!=j) ans++;
}
else if(f2[j] && f2[k])
{
if(f1[i] && f1[z] && i!=z) ans++;
}
else if(f2[j] && f2[z])
{
if(f1[i] && f1[k] && i!=k) ans++;
}
else if(f2[k] && f2[z])
{
if(f1[i] && f1[j] && i!=j) ans++;
}
}
else if(cnt==1)
{
if(f1[i] && f2[j] && f2[k] && f2[z]) ans++;
else if(f2[i] && f1[j] && f2[k] && f2[z]) ans++;
else if(f1[k] && f2[i] && f2[j] && f2[z]) ans++;
else if(f1[z] && f2[i] && f2[j] && f2[k]) ans++;
}else if(cnt==4) ans=24;
}
}
}
}
cout<<ans;
return 0;
}