题目
思路
其实这道题是比较简单的,只要可以求出全排列,然后再检查每个全排列是否满足要求即可,如果不会全排列的可以参考一下这篇文章全排列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;
}
结果
这里输出了全排列数为了方便观察。