题目
思路
其实这道题是比较简单的,只要可以求出全排列,然后再检查每个全排列是否满足要求即可,如果不会全排列的可以参考一下这篇文章全排列C语言
代码
#include<stdio.h> int a[1000]; int k; int n; int sum; void jc(){ int i; int t=0; for(i=2;i<n;i++){ if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1])){ t++; } } if(t==k){ printf("--"); sum=sum+1; } } void swap(int x,int y){ int t; t=a[x]; a[x]=a[y]; a[y]=t; } void perm(int p,int q){ if(p==q){//当p==q说明到了最后一个元素 int j; for(j=1;j<=n;j++){ printf("%5d",a[j]); } jc(); printf("\n"); }else{ int i; for(i=p;i<=q;i++){ swap(p,i); perm(p+1,q); swap(p,i); } } } int main(){ scanf("%d",&n);//输入n scanf("%d",&k); k--; //初始化数组 //初始化数组 int i; for(i=1;i<=n;i++){ a[i]=i; } //排列函数 perm(1,n);//perm(x,y),将数组中第x至第y个元素进行全排列 printf("%d",sum%123456); return 0; }
结果
这里输出了全排列数为了方便观察。