链接:https://ac.nowcoder.com/acm/contest/11217/I
来源:牛客网
题目描述
dd作为体操队队长,在给队员们排队形,体操队形为一个单独的纵列,体操队有n个同学,标号为1∼n,对于i(1≤i≤n)号队员,会有一个诉求(1≤a[i]≤n),表示他想排在a[i]号队员前面,当a[i]=i时,我们认为他没有位置需求,随便排哪儿都行,dd想知道有多少种队形方案,可以满足所有队员的要求。
输入描述:
读入第一行一个数字n(2≤n≤10)
第二行n个数字,表示a[i],保证1≤a[i]≤n
输出描述:
输出一行,表示方案数
示例1
输入
3
1 1 2
输出
1
题意
有n个同学,排队,每个同学都会有位置需求,想排在a[i]的前面,如果a[i]==i时说明i号同学没有位置需求,随便排位置,问如果能满足所有同学的位置需求,排队一共有多少种方法?
思路
枚举+暴力+全排列
首先把没有位置需求的同学的值改为0,然后去遍历查找有没有符合同学需求的位置,如果找到位置,但是该位置在其后面,则不作变化,方法数不加
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[20],b[20];
int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
a[i]=i;
for(int i=1; i<=n; i++)
{
scanf("%d",&b[i]);
if(b[i]==i)
b[i]=0;
}
int flag,ans=0,j;
do
{
flag=1;
for(int i=1; i<=n; i++)
{
if(b[a[i]])
{
for(j=1; j<=n; j++)
{
if(a[j]==b[a[i]])
{
break;
}
}
if(j>i)
{
flag=0;
break;
}
}
}
if(flag)
ans++;
}
while(next_permutation(a+1,a+n+1));
printf("%d\n",ans);
return 0;
}