题目
这里牵涉一个是否要考虑按照顺序的问题。 如 132 和 123 表示的是一种情况,对于这种情况要进行排除 我的思路是 集中从小到大排序。
#include<iostream>
#include<cstring>
using namespace std;
int cap[1000]={0};
int num[1000];
int n;
int cnt = 0;
int check(int n)
{
for(int i = 1; i < n; i++)
{
//所选人有重复
if(num[n]==num[i])
{
return 0;
}
//所选人为其他人的队长
if(num[i] == cap[num[n]]||cap[num[i]]==num[n])
{
return 0;
}
}
return 1;
}
void dfs()
{
memset(num,0,sizeof(num));
int k = 1;
while(k>0)
{
/*用于消除 132 123 的结果因为这表示同一种结果*/
if(num[k]<=num[k-1])
{
num[k] = num[k-1]+1;
}
else
{
num[k]++;
}
int flag = check(k);
while(num[k]<=n&&!flag)
{
num[k]++;
flag = check(k);
}
if(num[k]<=n)
{
cnt++;
for(int i = 1; i <= k; i++)
{
cout << num[i] << ends;
}
cout << endl;
if(k<n)
{
k++;
}
else
{
num[k] = 0;
k--;
}
}
else
{
num[k] = 0;
k--;
}
}
}
int main()
{
cin >> n;
cap[1] = 0;
for(int i = 2; i <= n; i++)
{
cin >> cap[i];
}
dfs();
cout << cnt;
return 0;
}