第七屆(16年)藍橋杯java B組決賽真題


1、憤怒小鳥(填空)
X星球憤怒的小鳥喜歡撞火車!

一根平直的鐵軌上兩火車間相距 1000 米
兩火車 (不妨稱A和B) 以時速 10米/秒 相對行駛。

憤怒的小鳥從A車出發,時速50米/秒,撞向B車,
然后返回去撞A車,再返回去撞B車,如此往復....
兩火車在相距1米處停車。

問:這期間憤怒的小鳥撞 B 車多少次?

注意:需要提交的是一個整數(表示撞B車的次數),不要填寫任何其它內容。

 1  public class One {
 2     //A、B的位置a、b的大小相對於A的起點而言,小鳥的速度為50,A、B的速度都為10
 3     public static double sum=0;//sum用於鳥和B在規定期間相撞的次數
 4     public static void funb(double a,double b){//在路程a、b間鳥由A撞向B
 5         if(b-a<=1){
 6             System.out.println(sum);
 7             return;
 8         }
 9         double time=(b-a)/(50+10);//距離為a、b期間鳥和B相撞的時的時間
10         a=a+10*time;//撞后A的位置
11         b=b-10*time;//撞后B的位置
12         sum++;
13         funa(a,b);//鳥和B相撞后鳥轉向A而行
14         return;
15     }
16     
17     public static void funa(double a,double b){//鳥由B向A飛行
18         if(b-a<1){//若鳥和B撞完后AB距離小於1,則sum--
19             sum--;
20             System.out.println(sum);
21         }
22         double time=(b-a)/(50+10);
23         a=a+10*time;//撞后A的位置
24         b=b-10*time;//撞后B的位置
25         funb(a,b);
26         return;
27     }
28     public static void main(String args[]){
29         double a=0,b=1000;
30         funb(a,b);
31     }
32 }
憤怒的小鳥(兩個函數間遞歸)

答案為:9

 

2、反幻方(填空)
我國古籍很早就記載着

2 9 4
7 5 3
6 1 8
這是一個三階幻方。每行每列以及對角線上的數字相加都相等。

下面考慮一個相反的問題。
可不可以用 1~9 的數字填入九宮格。
使得:每行每列每個對角線上的數字和都互不相等呢?

這應該能做到。
比如:
9 1 2
8 4 3
7 5 6

你的任務是搜索所有的三階反幻方。並統計出一共有多少種。
旋轉或鏡像算同一種。


比如:
9 1 2
8 4 3
7 5 6

7 8 9
5 4 1
6 3 2

2 1 9
3 4 8
6 5 7
等都算作同一種情況。

請提交三階反幻方一共多少種。這是一個整數,不要填寫任何多余內容。

 1 public class Main {
 2     public static int sum = 0;// 計數器
 3 
 4     public static void fun(int a[], int n) {
 5         if (n == 9) {
 6             text(a);
 7             return;
 8         } else {
 9             for (int i = n; i < 9; i++) { // n后面的
10                 int temp = a[i];
11                 a[i] = a[n];
12                 a[n] = temp;
13                 fun(a, n + 1);
14                 int tamp = a[i];
15                 a[i] = a[n];
16                 a[n] = tamp;
17             }
18         }
19     }
20 
21     public static void text(int a[]) {
22         int l1 = a[0] + a[1] + a[2];
23         int l2 = a[3] + a[4] + a[5];
24         int l3 = a[6] + a[7] + a[8];
25         int s1 = a[0] + a[3] + a[6];
26         int s2 = a[1] + a[4] + a[7];
27         int s3 = a[2] + a[5] + a[8];
28         int x1 = a[0] + a[4] + a[8];
29         int x2 = a[2] + a[4] + a[6];
30         if (l1 != l2 && l1 != l3 && l1 != s1 && l1 != s2 && l1 != s3 && l1 != x1 && l1 != x2)
31             if (l2 != l3 && l2 != s1 && l2 != s2 && l2 != s3 && l2 != x1 && l2 != x2)
32                 if (l3 != s1 && l3 != s2 && l3 != s3 && l3 != x1 && l3 != x2)
33                     if (s1 != s2 && s1 != s3 && s1 != x1 && s1 != x2)
34                         if (s2 != s3 && s2 != x1 && s2 != x2)
35                             if (s3 != x1 && s3 != x2)
36                                 if (x1 != x2)
37                                     sum++;
38     }
39     public static void main(String[] args){  
40         int a[]={1,2,3,4,5,6,7,8,9};  
41         fun(a,0);  
42         System.out.print(sum/8);  
43     }
44 }
三階反幻方(遞歸)

答案為:3120


3、打靶(填空)

小明參加X星球的打靶比賽。
比賽使用電子感應計分系統。其中有一局,小明得了96分。

這局小明共打了6發子彈,沒有脫靶。
但望遠鏡看過去,只有3個彈孔。
顯然,有些子彈准確地穿過了前邊的彈孔。

不同環數得分是這樣設置的:
1,2,3,5,10,20,25,50

那么小明的6發子彈得分都是多少呢?有哪些可能情況呢?

下面的程序解決了這個問題。
仔細閱讀分析代碼,填寫划線部分缺失的內容。

public class Main
{    
    static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
    {
        if(ho<0 || bu<0 || sc<0) return;
        if(k==ta.length){
            if(ho>0 || bu>0 || sc>0) return;
            for(int i=0; i<da.length; i++){
                for(int j=0; j<da[i]; j++)
                    System.out.print(ta[i] + " ");
            }
            System.out.println();
            return;
        }
        
        for(int i=0; i<=bu; i++){
            da[k] = i;
            f(ta, da, k+1,  __________________ , bu-i, sc-ta[k]*i);   // 填空位置
        }
        
        da[k] = 0;
    }
    
    public static void main(String[] args)
    {
        int[] ta = {1,2,3,5,10,20,25,50};
        int[] da = new int[8];
        f(ta, da, 0, 3, 6, 96);
    }
}

注意:只填寫划線處缺少的內容,不要填寫已有的代碼或符號,也不要填寫任何解釋說明文字等。

 1 public class Main
 2 {    
 3     static void f(int[] ta, int[] da, int k, int ho, int bu, int sc)
 4     {
 5         if(ho<0 || bu<0 || sc<0) return;
 6         if(k==ta.length){
 7             if(ho>0 || bu>0 || sc>0) return;
 8             for(int i=0; i<da.length; i++){
 9                 for(int j=0; j<da[i]; j++) 
10                     System.out.print(ta[i] + " ");
11             }
12             System.out.println();
13             return;
14         }
15         
16         for(int i=0; i<=bu; i++){
17             da[k] = i;
18             f(ta, da, k+1,  ho-1%(i+1) , bu-i, sc-ta[k]*i);   // 填空位置
19         }
20         
21         da[k] = 0;
22     }
23     
24     public static void main(String[] args)
25     {
26         int[] ta = {1,2,3,5,10,20,25,50};
27         int[] da = new int[8];
28         f(ta, da, 0, 3, 6, 96);
29     }
30 }
打靶(遞歸)

答案(划線代碼):ho-1%(i+1)

或:ho-da[k]/Math.max(da[k],1)

 

4、


免責聲明!

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



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