A B C D中取5次,每个字母都可以重复取出,形成一个串。
现在要求,串中A出现的次数必须为偶数(0次也算偶数)。
求可以形成多少种可能的串。
答案
528
解题过程
一开始没想到是深搜,被数学中的组合给干扰了(我数学不好,数学好的这题能用数学解出答案)。这题将ABCD分别用数字0123代替。用数组A[5]来模拟替换的过程:
0 0 0 0 0
0 0 0 0 1
0 0 0 0 2
0 0 0 0 3
0 0 0 1 0
0 0 0 1 1
……
可以发现这就是深搜的作用,从最后一个开始回溯,在回溯的过程中就把每个情况列出来了,你需要做的是对每个情况进行判断。
附上代码
#include<iostream>
using namespace std;
int a[5]={0};//5个位置用来放ABCD
int counts=0;
int num=5;
int main()
{
void DFS(int);
bool is_even();//判断是A否是偶数
DFS(0);
cout<<counts<<endl;
return 0;
}
bool is_even()
{
int even_num=0;
for(int i=0;i<num;i++)
{
if(a[i]==0)
even_num++;
}
if(even_num%2==0)
return true;
return false;
}
void DFS(int index)
{
if(index==num)
{
if(is_even())
counts++;
}
else
{ //这里是从4个字母中选,所以i<num-1,
//不是 i<num ,我在这被坑了
for(int i=0;i<num-1;i++)
{
a[index]=i;
DFS(index+1);
}
}
}