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)); }