
题意: #
有多组数据。
给出 $n$ 个字符串和 $k$ 个规则,求每个规则可以组成的所有密码。
在规则中 # 表示的是一个给出的字符串,0 表示的是 $0$ 到 $9$ 中的一个数字。
思路: #
深度优先搜索。
深度优先搜索函数传入两个量 $now$ 和 $ans$。
其中 $now$ 表示的是现在是规则里下标为 $now+1$ 字符,$ans$ 表示现在搜索到的答案。
当规则里下标为 $now+1$ 字符为 # 时,遍历给出的字符串,对于每一个给出的字符串都放在 $ans$ 后进行一次 dfs,注意不能影响后面的操作,如当遍历的是第 $i$ 个给出的字符串时,不能影响第 $i+1$ 及其之后的操作。
当规则里下标为 $now+1$ 字符为 0 时,把 $0$ 到 $9$ 按顺序放一次,同样不能影响后面的操作。
具体的代码为:
if(r[now]=='#'){// 是一个给出的字符串
for(int i=1;i<=n;i++){
dfs(now+1,ans+s[i]);
}
}
else if(r[now]=='0'){// 是一个数字
for(int i=0;i<=9;i++){
char a=i+'0';
dfs(now+1,ans+a);
}
}
完整代码: #
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int n,m;
string r;
string s[120];
void dfs(int now/*现在是 r 的第几个字符*/,string ans/*答案*/){
if(now>=r.size()){
cout<<ans<<"\n";
return;
}
if(r[now]=='#'){// 是一个给出的字符串
for(int i=1;i<=n;i++){
dfs(now+1,ans+s[i]);
}
}
else if(r[now]=='0'){
for(int i=0;i<=9;i++){
char a=i+'0';
dfs(now+1,ans+a);
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
while(cin>>n){// 不确定组数,每次如果有 n 输入说明有一组
cout<<"--\n";
for(int i=1;i<=n;i++)cin>>s[i];
cin>>m;
for(int i=1;i<=m;i++){
cin>>r;
dfs(0,"");
}
}
return 0;
}