作者cooper6334 (小恐龙)
看板C_and_CPP
标题Re: [问题] 0与1的排列组合
时间Sat Sep 26 13:53:56 2009
//我的做法是写两个函式
//第一个函式负责把1~n个1的字串送入rec
void a(int n){
int i=0,j=0;
char dat[11]={""};
for(i=1;i<n;i++){
sprintf(dat,"0%s",dat);}
printf("%s\n",dat);
for(i=0;i<n;i++){
for(j=0;j<i+1;j++){ //由於做完rec後dat会变成全0,所以要从最前面填1
dat[j]='1';}
rec(dat,n); }
}
//基本概念是把最右边的1往右移一格
//当这个1移到底,则把第二个1也往右移一格,并将底部全部的1挪回第二个1的右边
//直到所有的1都在最右边,也就是000111之类的形式
void rec(char dat[],int n){
int fg=0,c=0;
int i,j;
printf("%s\n",dat);
if(dat[n-1]!='1'){
for(i=n-1;i>=0;i--){
if(dat[i]=='1'){
dat[i+1]='1';
dat[i]='0';
b(dat,n);
break;}
}
}
//若最底为1,搜到1则c+1并设成0,搜到零则把flag立起
//当再度搜到1时,则将这个1往右移,并依照c在它右边填1
//当搜到底仍没有1,则离开递回(000111的形式)
else{
for(i=n-1;i>=0;i--){
if(dat[i]=='0'){
fg=1;}
if(dat[i]=='1' && fg==0){
c++;
dat[i]='0';}
if(fg==1 && dat[i]=='1'){
dat[i]='0';
for(j=i+1;j<i+2+c;j++){
dat[j]='1';}
b(dat,n);
break;}
}
}
}
我也跟你一样要写同样的作业
--
我要以耍冷来对抗温室效应
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.170.85.225
※ 编辑: cooper6334 来自: 118.170.85.225 (09/26 13:54)
1F:推 liu2007:相同的解法(握~) 只是我用递回想破头想不出来....(Q_Q) 09/26 13:56