一.全排列無重複字元
#include#include二.全排列有重複字元char buf[1024
];void func(int
index);
void swap(int index1,int
index2);
intmain()
void func(int
index)
else
}}void swap(int index1,int
index2)
由於全排列就是從第乙個數字起每個數分別與它後面的數字交換。我們先嘗試加個這樣的判斷——如果乙個數與後面的數字相同那麼這二個數就不交換了。如122,第乙個數與後面交換得212、221。然後122中第二數就不用與第三個數交換了,但對212,它第二個數與第三個數是不相同的,交換之後得到221。與由122中第乙個數與第三個數交換所得的221重複了。所以這個方法不行。
換種思維,對122,第乙個數1與第二個數2交換得到212,然後考慮第乙個數1與第三個數2交換,此時由於第三個數等於第二個數,所以第乙個數不再與第三個數交換。再考慮212,它的第二個數與第三個數交換可以得到解決221。此時全排列生成完畢。
這樣我們也得到了在全排列中去掉重複的規則——去重的全排列就是從第乙個數字起每個數分別與它後面非重複出現的數字交換。
#include#include三.從m個字元中取n個組合,如abc的組合有a、bc、ab、ac、bc、abcchar buf[1024
];void func(int
index);
void swap(int index1,int
index2);
bool isswap(int index1,int
index2);
intmain()
void func(int
index)
else}}
}void swap(int index1,int
index2)
bool isswap(int index1,int index2)//
判斷前面是否已經有與buf[index2]相同的字元
}return
true
; }
}
方法一:利用位運算來實現求組合,例如:對於字串行「abc」,讓其與1-7的二進位制相與,每次輸出對應二進位制為1的那幾位,即可輸出全部組合。
#include#include方法二:先決定選幾個字元,再遍歷字串,依次做兩種決策:第i個字元在結果中;第i個字元不在結果中,最後看字元數是否與開始選定的值相等char buf[1024
];void
func();
intmain()
void
func()
for(int i=1;i
}printf("\n
");}
}
**略四.八皇后問題
題目:在8×8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角斜線上。下圖中的每個黑色格仔表示乙個皇后,這就是一種符合條件的擺放方法。請求出總共有多少種擺法。
這就是有名的八皇后問題。解決這個問題通常需要用遞迴,而遞迴對程式設計能力的要求比較高。因此有不少面試官青睞這個題目,用來考察應聘者的分析複雜問題的能力以及程式設計的能力。
由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex[8],陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0-7初始化,接下來我們要做的事情就是對陣列columnindex做全排列。由於我們是用不同的數字初始化陣列中的數字,因此任意兩個皇后肯定不同列。我們只需要判斷得到的每乙個排列對應的八個皇后是不是在同一對角斜線上,也就是陣列的兩個下標i和j,是不是i-j==columnindex[i]-column[j]或者j-i==columnindex[i]-columnindex[j]。
#include#includeint buf[8
];void func(int
index);
void swap(int index1,int
index2);
bool
islegal();
intmain()
func(0);
return0;
}void func(int
index)
printf(
"%d\n
",buf[7
]); }
}for(int i=index;i<8;i++)
}void swap(int index1,int
index2)
else
}bool
islegal()}}
return
true
;}
字串排列組合
題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。題目分析 考慮把這個複雜的問題分解成為小的問題。整個字串的排列,可以看成兩個部分 首先,求所有可能出現在第乙個位置的字元 然...
字串排列組合
1 字串的組合 子串行 題目 輸入乙個字串,輸出該字串中字元的所有組合。例子 輸入 abc,它的組合有 a b c ab ac bc abc 分析 我們可以將字串中的每個字元看成二叉樹的乙個節點,根節點為空,每個節點都會有兩種選擇 要 和 不要 兩種選擇 那麼我們就可以利用遞迴實現。public c...
字串的排列組合問題
問題1 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。思路 這是個遞迴求解的問題。遞迴演算法有四個特性 1 必須有可達到的終止條件,否則程式將陷入死迴圈 2 子問題在規模上比原問題小 3 子...