版权声明:转载商用请通知本人 https://blog.csdn.net/qq_41076577/article/details/83420134
鸽洞原理
(任意给定5个数字,其中必定存在3个数字已经有序(或者升序,或者降序),找出这5个数字中最长的升序或者降序序列。10个数字必定有4个有序
#include<stdio.h>
#include<string.h>
#include<conio.h>
#define M 2//C5M
void Compose(char *str,char *rstr,int n,int lyr,int k);
int panding(char *str,int n);
int main()
{
char str[]="17539";
char rstr[10];
int i;
memset(rstr,0,10);
for(i=0;i<2;i++)
Compose(str,rstr,M+i,0,i);
getch();
return 0;
}
void Compose(char *str,char* rstr,int n,int lyr,int k){
int i;
if(lyr==M+k)
{
rstr[M+k]=0;
if(panding(rstr,M+k)==1)
puts(rstr);
return;
}
for(i=0;str[n-1+i]!=0;i++)
{
rstr[lyr]=str[i];
Compose(&str[i+1],rstr,n-1,lyr+1,k);
}
}
int panding(char *str,int n)
{
int i,count1=0,count2=0;//1表示有序
for(i=0;i<n-1;i++)
{
if(str[i]<=str[i+1])
count1++;
}
for(i=0;i<n-1;i++)
{
if(str[i]>=str[i+1])
count2++;
}
if((count1==n-1)||(count2==n-1))
return 1;
else
return 0;
}