利用遞迴來模擬多重巢狀迴圈.
阿新 • • 發佈:2019-01-05
盧卡斯的驅逐者大軍已經來到了赫柏的卡諾薩城,赫柏終於下定決心,集結了大軍,與驅逐者全面開戰。
盧卡斯的手下有6名天之驅逐者,這6名天之驅逐者各賦異能,是盧卡斯的主力。
為了擊敗盧卡斯,赫柏必須好好考慮如何安排自己的狂戰士前去迎戰。
狂戰士的魔法與一些天之驅逐者的魔法屬性是相剋的,第i名狂戰士的魔法可以剋制的天之驅逐者的集合為Si(Si中的每個元素屬於[0,5])。
為了公平,兩名狂戰士不能攻擊同一個天之驅逐者。
現在赫柏需要知道共有多少種分派方案。
例:
S1={01},S2={23},代表編號為0的狂戰士的魔法可以剋制編號為0和編號為1的天之驅逐者,編號為1的狂戰士的魔法可以剋制編號為2和編號為3的天之驅逐者,共有四種方案:02,03,12,13。
02---代表第一個狂戰士負責編號為0的驅逐者,第二個狂戰士負責編號為2的驅逐者;
03---代表第一個狂戰士負責編號為0的驅逐者,第二個狂戰士負責編號為3的驅逐者;
12---代表第一個狂戰士負責編號為1的驅逐者,第二個狂戰士負責編號為2的驅逐者;
13---代表第一個狂戰士負責編號為1的驅逐者,第二個狂戰士負責編號為3的驅逐者;
S1={01},S2={01},代表編號為0的狂戰士的魔法可以剋制編號為0和編號為1的天之驅逐者,編號為1的狂戰士的魔法可以剋制編號為0和編號為1的天之驅逐者,共有兩種方案:01,10。
盧卡斯的手下有6名天之驅逐者,這6名天之驅逐者各賦異能,是盧卡斯的主力。
為了擊敗盧卡斯,赫柏必須好好考慮如何安排自己的狂戰士前去迎戰。
狂戰士的魔法與一些天之驅逐者的魔法屬性是相剋的,第i名狂戰士的魔法可以剋制的天之驅逐者的集合為Si(Si中的每個元素屬於[0,5])。
為了公平,兩名狂戰士不能攻擊同一個天之驅逐者。
現在赫柏需要知道共有多少種分派方案。
例:
S1={01},S2={23},代表編號為0的狂戰士的魔法可以剋制編號為0和編號為1的天之驅逐者,編號為1的狂戰士的魔法可以剋制編號為2和編號為3的天之驅逐者,共有四種方案:02,03,12,13。
02---代表第一個狂戰士負責編號為0的驅逐者,第二個狂戰士負責編號為2的驅逐者;
03---代表第一個狂戰士負責編號為0的驅逐者,第二個狂戰士負責編號為3的驅逐者;
12---代表第一個狂戰士負責編號為1的驅逐者,第二個狂戰士負責編號為2的驅逐者;
13---代表第一個狂戰士負責編號為1的驅逐者,第二個狂戰士負責編號為3的驅逐者;
S1={01},S2={01},代表編號為0的狂戰士的魔法可以剋制編號為0和編號為1的天之驅逐者,編號為1的狂戰士的魔法可以剋制編號為0和編號為1的天之驅逐者,共有兩種方案:01,10。
輸入描述:
多組測試資料,請處理到檔案結束。
對於每組測試資料:
第一行為一個整數N,代表狂戰士的數量。
第二行為N個字串,第i個字串表示第i個狂戰士能夠剋制的天之驅逐者的集合。
保證:
1<=N<=6,1<=每個字串的長度<=6,且每個字元都是0~5中的一個數字。
輸出描述:
輸出一個整數,代表分配方案數
輸入例子:
2 01 23 2 01 01 3 3 015 5
輸出例子:
4 2 2
分析: 可以套用for迴圈巢狀的模型來解決. 但是由於:1,狂戰士數量未知 2,狂戰士數量可能很多,最多需要寫6層的巢狀.所以採用遞迴來實現和迴圈巢狀相同的執行過程.
<span style="color:#999999;">import java.util.Scanner; public class Main{ static String res = "";//每個可能的組合結果 static int num = 0;//所求組合數量 public static void main(String[] args) { Scanner in = new Scanner(System.in); int xb = 0; while(in.hasNext()){ int count = in.nextInt(); String[] Si = new String[count]; for(int i=0;i<count;i++) Si[i] = in.next(); dfs(Si,xb); System.out.println(num); res = ""; num = 0; } } //遞迴,和迴圈巢狀模型執行順序相同 private static void dfs(String[] Si,int xb) { for(int i=0;i<Si[xb].length();i++){ if(!res.contains(Si[xb].charAt(i)+"")){ if(xb == Si.length-1){//到了陣列尾 num++; } else{ res = res + Si[xb].charAt(i); dfs(Si, xb+1); res = res.substring(0,res.length()-1); } } } } }</span>