列表

详情


NC229386. 体操队形

描述

作为体操队队长,在给队员们排队形,体操队形为一个单独的纵列,体操队有个同学,标号为,对于号队员,会有一个诉求,表示他想排在号队员前面,当时,我们认为他没有位置需求,随便排哪儿都行,想知道有多少种队形方案,可以满足所有队员的要求。

输入描述

读入第一行一个数字n(2≤n≤10)
第二行n个数字,表示a[i],保证1≤a[i]≤n

输出描述

输出一行,表示方案数

示例1

输入:

3
1 1 2

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 192ms, 内存消耗: 440K, 提交时间: 2023-04-01 23:45:42

#include<bits/stdc++.h>
using namespace std;
int n;
int a[66],b[66];
int cnt;
void dfs(int step)
{
	if(step==n)
	{
		cnt++;
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(b[i]==1) continue;
		if(a[i]!=i&&b[a[i]]==1) continue;
		b[i]=1;
		dfs(step+1);
		b[i]=0;
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	dfs(0);
	cout<<cnt<<endl;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 120ms, 内存消耗: 444K, 提交时间: 2023-04-01 11:18:47

#include<bits/stdc++.h>
int a[12],p,i,n, ans,th[12] = { 0,1,2,3,4,5,6,7,8,9,10};
int main(){
    for (scanf("%d",&n),i = 1; i <= n; scanf("%d",a+i),i++);
    do for (i = 1,p=1; i <= n;th[i] > th[a[i]]?p = 0:1,i++);
    while (p==1?ans++:1,std::next_permutation(th + 1, th + n + 1)?1:0*printf("%d",ans));
}

上一题