Re: [問題] 0與1的排列組合

看板C_and_CPP作者 (小恐龍)時間14年前 (2009/09/26 13:53), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/5 (看更多)
//我的做法是寫兩個函式 //第一個函式負責把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)

09/26 13:56, , 1F
相同的解法(握~) 只是我用遞迴想破頭想不出來....(Q_Q)
09/26 13:56, 1F
文章代碼(AID): #1AlQntHu (C_and_CPP)
文章代碼(AID): #1AlQntHu (C_and_CPP)