标程解法是用暴力枚举做的
#include <bits/stdc++.h>
using namespace std;
vector<string> a;
int n;
int b[10];
int ret;
void dfs(int i) {
if(i == a.size()) {
ret++;
} else {
for(int j = 0; j < a[i].size(); j++) {
if(b[a[i][j] - '0']) {
b[a[i][j] - '0'] = 0;
dfs(i + 1);
b[a[i][j] - '0'] = 1;
}
}
}
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
string x; cin >> x;
a.push_back(x);
}
for(int i = 0; i < 10; i++) b[i] = 1;
ret = 0;
dfs(0);
cout << ret << endl;
return 0;
}
楼主愚笨,画了半天草图也不懂他的思路,或者有别的解法欢迎指出,谢谢了!