1. 程式人生 > >利用遞迴來模擬多重巢狀迴圈.

利用遞迴來模擬多重巢狀迴圈.

盧卡斯的驅逐者大軍已經來到了赫柏的卡諾薩城,赫柏終於下定決心,集結了大軍,與驅逐者全面開戰。
盧卡斯的手下有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>