第七屆藍橋杯javaB組真題解析-抽簽(第五題)


題目

/*
抽簽

X星球要派出一個5人組成的觀察團前往W星。
其中:
A國最多可以派出4人。
B國最多可以派出2人。
C國最多可以派出2人。
....

那么最終派往W星的觀察團會有多少種國別的不同組合呢?

下面的程序解決了這個問題。
數組a[] 中既是每個國家可以派出的最多的名額。
程序執行結果為:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,總共101行)


public class A
{
    public static void f(int[] a, int k, int n, String s)
    {
        if(k==a.length){ 
            if(n==0) System.out.println(s);
            return;
        }
        
        String s2 = s;
        for(int i=0; i<=a[k]; i++){
            _____________________________;   //填空位置
            s2 += (char)(k+'A');
        }
    }
    
    public static void main(String[] args)
    {
        int[] a = {4,2,2,1,1,3};
        
        f(a,0,5,"");
    }
}


仔細閱讀代碼,填寫划線部分缺少的內容。

注意:不要填寫任何已有內容或說明性文字。
*/

 

 

答案

f(a,k+1,n-i,s2)

 

 

代碼

 1 public class Main {
 2     public static void f(int[] a, int k, int n, String s)
 3     {
 4         if(k==a.length){ 
 5             if(n==0) System.out.println(s);
 6             return;
 7         }
 8         
 9         String s2 = s;
10         for(int i=0; i<=a[k]; i++){
11             f(a,k+1,n-i,s2);  //填空位置
12             s2 += (char)(k+'A');
13         }
14     }
15     
16     public static void main(String[] args)
17     {
18         int[] a = {4,2,2,1,1,3};
19         
20         f(a,0,5,"");
21     }
22 }

 

 

分析

  這是一道很基礎的循環遞歸題目,代碼寫的很精巧,但是也有沒考慮到的地方,先說代碼思路

 1     public static void f(int[] a, int k, int n, String s)
 2     {
 3         if(k==a.length){ 
 4             if(n==0) System.out.println(s);
 5             return;
 6         }
 7         
 8         String s2 = s;
 9         for(int i=0; i<=a[k]; i++){
10             f(a,k+1,n-i,s2);  //填空位置
11             s2 += (char)(k+'A');
12         }
13     }

 

  數組a是用來存儲各個國家可以派遣的人數, 方法 f(int[] a, int k, int n, String s) 其中int[] a指代數組a,變量k 指代國家索引,變量n 指代當前已經選出的人數,變量s 指代 一個選出的用字符串表示的情況

  for循環,循環當前國家(a[k])的情況,並用s2存下來,然后k+1遞歸進入下一個國家(索引值),n-i 表示還需要派遣的人數,s2表示存儲的當前情況。

  

代碼改進

  這個代碼沒有考慮當派遣的人數大於5的情況,這個情況時應該讓代碼跳出遞歸,改進的代碼

 1 public class Main {
 2     public static void f(int[] a, int k, int n, String s)
 3     {
 4         if(k==a.length){ 
 5             if(n==0) System.out.println(s);
 6             return;
 7         }
 8         if(n<0)return;//改進的地方
 9         String s2 = s;
10         for(int i=0; i<=a[k]; i++){
11             f(a,k+1,n-i,s2);  //填空位置
12 //            System.out.println("-----"+s2+"------");
13             s2 += (char)(k+'A');
14         }
15     }
16     
17     public static void main(String[] args)
18     {
19         int[] a = {4,2,2,1,1,3};
20         
21         f(a,0,5,"");
22     }
23 }

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM