蓝桥杯试题——G将军有一支训练有素的军队
样例输入1:
3
1 1
样例输出1:
4
样例输入2:
7
1 1 2 2 3 3
样例输出2:
40
代码:
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int superior[100002];
int soldiers[100002];
vector<int> subordinate[100002];
int ans;
int N;
int sub(int n)
{
for (int i = 0; i < subordinate[n].size(); i++) {
if (soldiers[subordinate[n][i]] != 0)
return 0;//如果n的下属在soldiers数组中就返回0;
}
return 1;//不在就返回1;
}
void f(int n,int star)
{
if (n == 0) {
ans++;
return;
}
else {
for (int i = star + 1; i <= N; i++)
if (sub(i) && soldiers[superior[i]] == 0) {//i的下级不在soldiers中,并且i的上级不在soldiers中
soldiers[i] = 1;//i进入soldiers数组
f(n - 1, i);
soldiers[i] = 0;//i出soldiers数组
}
}
return;
}
int main()
{
cin >> N;
memset(superior, 0, sizeof(int) * 100002);
for (int i = 2; i <= N; i++)
cin >> superior[i];
memset(subordinate, 0, sizeof(int) * 100002);
for (int i = 2; i <= N; i++)
subordinate[superior[i]].push_back(i);
ans = 0;
for (int i = 1; i <= N; i++) {
memset(soldiers, 0, sizeof(int) * 100002);//soldiers数组重置
f(i,0);
}
cout << ans;
return 0;
}