题目:
分析:
给出统计数字全排列的代码
void f(vector<int> nums,vector<int> n,int c)
{//该往c位置放了
if(c==n.size()){
all++;
return;
}
int last=-1<<30;
for(int i=0;i<nums.size();i++)
{
if(n[i]) continue;
if(nums[i]==last) continue;
n[i]=1;
last=nums[i];
f(nums,n,c+1);
n[i]=0;
}
}
int main()
{
vector<int> nums;//数
nums.push_back(1);
nums.push_back(2);
nums.push_back(1);
sort(nums.begin(),nums.end());
vector<int> n(nums.size(),0);//使用过吗
f(nums,n,0);
cout<<all;
}
我的方法是,直接在每次进入函数都统计即可,因为每一次进入函数都说明之前的不存在重复了。
说的有些不清楚,但应该挺好想的。
最终再减1,刚进入时不应该+1的。
代码:
int all=-1;
void f(vector<char> nums,vector<int> n,int c)
{//该往c位置放了
all++;
if(c==n.size()){
return;
}
char last='?';
for(int i=0;i<nums.size();i++)
{
if(n[i]) continue;
if(nums[i]==last) continue;
n[i]=1;
last=nums[i];
f(nums,n,c+1);
n[i]=0;
}
}
int main()
{
string t="AAB";
vector<char> nums;
for(int i=0;i<t.length();i++)
nums.push_back(t[i]);
sort(nums.begin(),nums.end());
vector<int> n(nums.size(),0);//使用过吗
f(nums,n,0);
cout<<all;
}