因为很小,直接dfs枚举就可以,主要是看如何去重
这里是一种去重思路,将原来字符串排序然后直接看上一个是否使用过,如果没有使用过那说明这两个(多个)都不能用,所以不考虑放入
#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <string>
using namespace std;
#define ll long long
string s;
vector<bool>u(12,false);
ll ans=0;
void dfs(char lst,int cnt){
if(cnt==s.length()){
ans++;
return;
}
for(int i=0;i<s.length();i++){
if(u[i]==1||lst==s[i]||(i>0&&s[i]==s[i-1]&&u[i-1]==0))continue;
u[i]=true;
dfs(s[i],cnt+1);
u[i]=false;
}
}
int main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin>>s;
sort(s.begin(),s.end());
dfs(' ',0);
cout<<ans<<endl;
//cout<<"copyright Refra1n"<<endl;
return 0;
}

京公网安备 11010502036488号