作為乙個剛接觸c程不久的學生,我表示csdn裡大神們用的解題方式好多都不明其意
所以我決定用自己的想法來嘗試
at first:
我意圖降低難度,編寫乙個可以有重複的全排列。
因此我想把它做成乙個數,是以n(個數)為進製數的一串數,輸出
然而我發現要做未知量進製的進製轉化**太過麻煩
second:
我想用二位陣列解決,但是並沒*用;
然後我開始看了一下大神們的**233
#include
#include
這種**抬頭你讓我乙個剛看完譚浩強的紅皮書的大一學生怎麼理解
thrid:
在我的不斷努力下還是找到了一種思路:
交換乙個從賦值為1到n的一維陣列。詳情見()
但是....這解決了全排列,可是簡單地有重複的問題卻沒有解決
finally:
我決定按照一維陣列的想法自食其力,在一維陣列的條件下完成n進製的情況
思路:設定乙個一維n項陣列,給每一項設定初始值1;
讓n-1項的值一直加一,當它的值大於n時讓n-2的值加一,同理用遍歷達成,還完成了n進製的問題
然後用乙個標記,記錄陣列中出現相同數字的次數,如果次數》0,則不列印這一串陣列,反之列印;
最後用乙個條件,當陣列中的數大於最終值時,停止函式,防止函式無限迴圈。
最終**為
#include
int main ( )
print(a,n);
return0;
}void print(int *a,int n)}}
if(flag==0)
printf("\n");
}a[n-1]+=1;
for(i=n-1;i>=0;i--)
}for(i=0;isum+=*(a+i);
}if(sum!=n*n) print(a,n);
else return;
}同理轉化為有重複的全排列也是可以進行的
全排列問題
一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...
全排列問題
題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...
全排列問題
全排列就是從第乙個數字起 每個數分別與它後面的數字交換 用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba。第一種方法 用遞迴 不包含有重複數字或字元出現的情況 void swap char a,...