很无聊,出个题吧,大家想想。
我同学给了我5张扑克牌,点数是连续的——如3,4,5,6,7 我可以从里面抽出连续的两张放到剩下3张牌的左边或右边—— 如抽出4,5放到左边得4,5,3,6,7。 我一共有3次机会抽牌,重复3次后必须把扑克牌倒序排列 如3,4,5,6,7为7,6,5,4,3 编程找出解法。 推广——给出任意牌数,抽牌次数和一次抽连续拍的张数,编程找出解法。
当然你用自己先玩玩也可以,)
#include<stdio.h> int fangxu(int a[5]) { int n=0,i,j; for(i=0;i<5;i++) for(j=i+1;j<5;j++) if(a[i]>a[j])n++; return n; } void print(int a[5]) { int i; for(i=0;i<5;i++) printf("%d ",a[i]); printf("\n\n"); } int * ok(int i,int a[5]) { int b,c; if(i==1) { b=a[0];a[0]=a[2];a[2]=b; } if(i==2) { b=a[1];a[1]=a[3];a[3]=b; c=a[2];a[2]=a[4];a[4]=c; } if(i==3) { b=a[0];a[0]=a[1];a[1]=b; c=a[2];a[2]=a[3];a[3]=a[4]; a[4]=c; } if(i==4) { b=a[0];a[0]=a[2];a[2]=a[3]; a[3]=a[4];a[4]=a[1];a[1]=b; } if(i==5) { b=a[0];a[0]=a[3]; a[3]=a[1];a[1]=a[2];a[2]=b; } if(i==6) { b=a[2];a[2]=a[4];a[4]=a[3]; a[3]=b; } if(i==7) { b=a[0];a[0]=a[2];a[2]=a[1]; a[1]=b; c=a[3];a[3]=a[4];a[4]=c; } if(i==8) { b=a[0];a[0]=a[3];a[3]=a[4]; a[4]=a[2];a[2]=a[1];a[1]=b; } return a; } int * huanyuan(int i,int a[5]) { int b,c; if(i==1) { b=a[0];a[0]=a[2];a[2]=b; } if(i==2) { b=a[1];a[1]=a[3];a[3]=b; c=a[2];a[2]=a[4];a[4]=c; } if(i==3) { b=a[0];a[0]=a[1];a[1]=b; c=a[2];a[2]=a[4];a[4]=a[3]; a[3]=c; } if(i==4) { b=a[0];a[0]=a[1];a[1]=a[4]; a[4]=a[3];a[3]=a[2];a[2]=b; } if(i==5) { b=a[0];a[0]=a[2]; a[2]=a[1];a[1]=a[3];a[3]=b; } if(i==6) { b=a[2];a[2]=a[3];a[3]=a[4];a[4]=b; } if(i==7) { b=a[0];a[0]=a[1];a[1]=a[2];a[2]=b; c=a[3];a[3]=a[4];a[4]=c; } if(i==8) { b=a[0];a[0]=a[1];a[1]=a[2]; a[2]=a[4];a[4]=a[3];a[3]=b; } return a; }
main() { int i,j,k,n,b[5],c[5]; int a[5]={3,4,5,6,7}; for(i=1;i<9;i++) for(j=1;j<9;j++) for(k=1;k<9;k++) { ok(k,a); if(fangxu(a)==3) { for(n=0;n<5;n++)b[n]=a[n]; ok(j,b); if(fangxu(b)==6) { for(n=0;n<5;n++)c[n]=b[n]; ok(i,c); if(fangxu(c)==10) { printf("1-->");print(a); printf("2-->");print(b); printf("3-->");print(c); printf("\n\n\n"); huanyuan(k,a); } else huanyuan(j,c); } else huanyuan(i,b); }
else huanyuan(k,a); } }大家可以一起看一看
我发了三天终于有点收获了