利用递归来模拟多重嵌套循环.

原文地址:https://blog.csdn.net/haiboself/article/details/51946327

//利用递归来模拟多重嵌套循环.
如以下循环:
1
2
3
4
5
6
for (int i=0;i<100;i++)
     for (int j=0;j<100;j++)
         for (int k=0;k<100;k++){
             System.out.println( "hello!" );
         }
   

对应递归:

[java]  view plain  copy
  1. public static void demo(){  
  2.     int[] counts = new int[3];  
  3.     counts[0] = 1;  
  4.     counts[1] = 2;  
  5.     counts[2] = 3;  
  6.    
  7.     for(int i=0;i<counts[0];i++)  
  8.         for(int j=0;j<counts[1];j++)  
  9.             for(int k=0;k<counts[2];k++){  
  10.                 System.out.println("hello!");  
  11.             }  
  12.    
  13.     int index = 0;//下标  
  14.     dfs(counts,index);//对应递归  
  15. }  
  16.    
  17. //对应递归,和i,j,k的三层循环执行顺序和效果想通过.  
  18. public static void dfs(int[] counts,int index){  
  19.     for(int i=0;i<counts[index];i++){  
  20.         if(index == counts.length-1){//到最后一个循环控制变量k了  
  21.             System.out.println("hello");  
  22.         }  
  23.         else{  
  24.             dfs(counts,index+1);  
  25.         }  
  26.     }  
  27. }  


应用:

卢卡斯的驱逐者大军已经来到了赫柏的卡诺萨城,赫柏终于下定决心,集结了大军,与驱逐者全面开战。
卢卡斯的手下有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层的嵌套.所以采用递归来实现和循环嵌套相同的执行过程.
[java]  view plain  copy
  1. <span style="color:#999999;">import java.util.Scanner;  
  2. public class Main{     
  3.     static String res = "";//每个可能的组合结果  
  4.     static int num = 0;//所求组合数量  
  5.        
  6.    public static void main(String[] args) {  
  7.           
  8.        Scanner in = new Scanner(System.in);  
  9.        int xb = 0;  
  10.        while(in.hasNext()){  
  11.            int count = in.nextInt();  
  12.            String[] Si = new String[count];  
  13.               
  14.            for(int i=0;i<count;i++)  
  15.                Si[i] = in.next();  
  16.               
  17.            dfs(Si,xb);  
  18.            System.out.println(num);  
  19.               
  20.            res = "";  
  21.            num = 0;  
  22.        }  
  23.    }  
  24.    
  25.    //递归,和循环嵌套模型执行顺序相同  
  26.    private static void dfs(String[] Si,int xb) {  
  27.        for(int i=0;i<Si[xb].length();i++){  
  28.            if(!res.contains(Si[xb].charAt(i)+"")){  
  29.                if(xb == Si.length-1){//到了数组尾  
  30.                    num++;  
  31.                }  
  32.                else{  
  33.                    res = res + Si[xb].charAt(i);  
  34.                    dfs(Si, xb+1);  
  35.                    res = res.substring(0,res.length()-1);  
  36.                }  
  37.            }  
  38.        }  
  39.    }  
  40. }</span>  


猜你喜欢

转载自blog.csdn.net/metal1/article/details/80160821