问题 C: 找回密码
题目描述
小明忘记了他的密码,现在向你寻求帮助,希望你能帮他找回密码。他告诉你他的密码是由4个数字(0到9)组成的。他能记得0到9中哪些数字出现过哪些没出现过,也有记不得出没出现过的数字。
现在给你一个长度为10的字符串s(s0,s1,s2,,,,,s9)
如果si为o那么他记得数字i出现过(可能不止出现过一次)。
如果si为x那么他记得数字i没出现过
如果si为?那么他不记得数字i是否出现过
现在要你输出有多少种密码可能是小明的密码
输入
字符串s
s是一个长度为10的字符串,由o,x,?组成。
输出
有多少种可能的密码
样例输入
ooo???xxxx
样例输出
108
提示
另外一组样例
输入
o?oo?oxoxo
输出
0
#include <bits/stdc++.h>
using namespace std;
int fun(string s,int count,string sb) {
int suoyou=0;
if(count==4) {
for(int i=0; i<sb.length(); i++) {
if(s[int(sb[i]-'0')]=='x') {
return 0;
}
}
for(int i=0; i<s.length(); i++) {
if(s[i]=='o') {
int maxcount=0;
for(int j=0; j<sb.length(); j++) {
if(sb[j]=='0'+i)
maxcount++;
}
if(maxcount==0)
return 0;
}
}
return 1;
}
for(int i=0; i<s.length(); i++) {
sb[count]='0'+i;
suoyou+=fun(s,count+1,sb);
}
return suoyou;
}
int main() {
string s;
cin>>s;
cout<<fun(s,0,"0000");
return 0;
}