第九屆藍橋杯大賽個人賽決賽(軟件類)真題Java


更新中..........

 
01 結果填空 (滿分11分)

 

標題:年齡問題


s夫人一向很神秘。這會兒有人問起她的年齡,她想了想說:
"20年前,我丈夫的年齡剛好是我的2倍,而現在他的年齡剛好是我的1.5倍"。


你能算出s夫人現在的年齡嗎?


注意:需要提交的是一個整數,不要填寫任何多余的內容。

 

解答:這道題實際上估算以下就可以得出答案,不放心可以放到EXCEl中看看。
夫人為:40歲

 

02 結果填空(滿分35分)


標題:最大乘積


把 1~9 這9個數字分成兩組,中間插入乘號,
有的時候,它們的乘積也只包含1~9這9個數字,而且每個數字只出現1次。


比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...


符合這種規律的算式還有很多,請你計算在所有這些算式中,乘積最大是多少?


注意:需要提交的是一個整數,表示那個最大的積,不要填寫任何多余的內容。
(只提交乘積,不要提交整個算式)
code:
package the.ninth;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;

public class Solution1 {

    private static int[] data = new int[101];

    private static boolean[] vis = new boolean[101];
    
    private static HashSet<Integer> sets=new HashSet<>();

    static BigInteger xx=new BigInteger("345619872");
    
    static Random random = new Random();
    
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            sets.add(i);
        }
        //System.out.println(987654321);
        dfs(1,1);
        System.out.println(xx);

    }
    
    //9 * 87146325 = 784316925 815497632
    static void dfs(int index,int u) {
        if(index==10) {
            
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = 1; i <=9; i++) {
                list.add(data[i]);
            }
            StringBuffer buff1 = new StringBuffer();
            for (int i =u++; i < list.size(); i++) {
                buff1.append(list.remove(i));
            }
            BigInteger a = new BigInteger(buff1.toString());
            StringBuffer buff2 = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                buff2.append(list.get(i));
            }
            BigInteger b = new BigInteger(buff2.toString());
            BigInteger multiply = a.multiply(b);
            char[] cs = multiply.toString().toCharArray();
            for (int i = 0; i < cs.length; i++) {
                for (int j = i+1; j < cs.length; j++) {
                    if(cs[i]=='0'||cs[j]=='0')return;
                    if(cs[i]==cs[j]) {
                        return;
                    }
                }
            }
            xx = multiply.max(xx);
            return;
        }
        for (int i = 1; i <=9; i++) {
            if(vis[i]==false) {
                data[index]=i;
                vis[i]=true;
                dfs(index+1,u);
                vis[i]=false;
            }
        }
        return;
    }

}

 

 
03 代碼填空(滿分27分)
 

標題:全排列

 
對於某個串,比如:“1234”,求它的所有全排列。
並且要求這些全排列一定要按照字母的升序排列。
對於“1234”,應該輸出(一共4!=24行):
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
 
下面是實現程序,請仔細分析程序邏輯,並填寫划線部分缺少的代碼。
 
#include <stdio.h>
#include <string.h>
 
//輪換前n個,再遞歸處理
void permu(char* data, int cur)
{
int i,j;
if(data[cur]=='\0'){
printf("%s\n", data);
return;
}
for(i=cur; data; i++){
char tmp = data;
for(j=i-1; j>=cur; j--) data[j+1] = data[j];
data[cur] = tmp;
 
permu(data, cur+1);
 
tmp = data[cur];
___________________________________ ;  //填空
data = tmp;
}
}
 
int main()
{
char a[] = "1234";
permu(a,0);
return 0;
}
 
注意:只需要填寫划線部分缺少的內容,不要抄寫已有的代碼或符號。
 
#include <stdio.h>
#include <string.h>

//輪換前n個,再遞歸處理
void permu(char* data, int cur) {
    int i,j;
    if(data[cur]=='\0') {
        printf("%s\n", data);
        return;
    }
    for(i=cur; i<4; i++) {
        char tmp = data[i];
        for(j=i-1; j>=cur; j--)
            data[j+1] = data[j];
        data[cur] = tmp;

        permu(data, cur+1);

        tmp = data[cur];
        data[cur]= data[cur+1];  //填空
        data[cur] = tmp;
    }
}

int main() {
    char a[] = "1234";
    permu(a,0);
    return 0;
}

 

 
 
04 程序設計(滿分45分)
 

標題:約瑟夫環

 
n 個人的編號是 1~n,如果他們依編號按順時針排成一個圓圈,從編號是1的人開始順時針報數。
(報數是從1報起)當報到 k 的時候,這個人就退出游戲圈。下一個人重新從1開始報數。
求最后剩下的人的編號。這就是著名的約瑟夫環問題。
 
本題目就是已知 n,k 的情況下,求最后剩下的人的編號。
 
題目的輸入是一行,2個空格分開的整數n, k
要求輸出一個整數,表示最后剩下的人的編號。
 
約定:0 < n,k < 1百萬
 
例如輸入:
10 3
 
程序應該輸出:
4
 
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms
 
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
 
注意:main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。
提交程序時,注意選擇所期望的語言類型和編譯器類型。
 
public static void main(String[] args) {
        int a=41;
        int b=3;
        LinkedList<Integer> list = new LinkedList<>();
        for (int i = 0; i < a; i++) {
            list.add(i+1);
        }
        while (list.size()>1){
            for (int i = 0; i < b-1; i++) {
                list.add(list.remove());
            }
            System.out.print("->"+list.getFirst());
            list.remove();//remve head
        }
        System.out.println(list.getFirst());
    }

 

 
 
05 程序設計(滿分77分)
 

標題:交換次數

 
IT產業人才需求節節攀升。業內巨頭百度、阿里巴巴、騰訊(簡稱BAT)在某海灘進行招聘活動。
招聘部門一字排開。由於是自由搶占席位,三大公司的席位隨機交錯在一起,形如:
ABABTATT,這使得應聘者十分別扭。
於是,管理部門要求招聘方進行必要的交換位置,使得每個集團的席位都挨在一起。即最后形如:
BBAAATTT 這樣的形狀,當然,也可能是:
AAABBTTT 等。
 
現在,假設每次只能交換2個席位,並且知道現在的席位分布,
你的任務是計算:要使每個集團的招聘席位都挨在一起需要至少進行多少次交換動作。
 
輸入是一行n個字符(只含有字母B、A或T),表示現在的席位分布。
輸出是一個整數,表示至少交換次數。
 
比如,輸入:
TABTABBTTTT
 
程序應該輸出:
3
 
再比如,輸入:
TTAAABB
 
程序應該輸出:
0
 
我們約定,輸入字符串的長度n 不大於10萬
 
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms
 
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
 
注意:main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。
提交程序時,注意選擇所期望的語言類型和編譯器類型。
 
06 程序設計(滿分105分)
 不清楚是否正確,給了幾個數據正常:
public class B {

    private static int MINX = 0;

    private static int x = 0;
    private static int y = 0;

    static boolean flag = false;
    //TABTABBTTTT
    public static void main(String[] args) {
        String str = "TTAAABB";//TABTABBTTTT
        char[] arr = str.toCharArray();
        char s = 0;
        int sx = 0;
        char e = 0;
        int ex = 0;
        
        boolean flag2=true;
        for (int i = 0; i < arr.length-1; i++) {
            if(arr[i]==arr[i+1]) {
                y++;
                flag2=false;
            }
            if(arr[i]!=arr[i+1]&&flag2==false) {
                y--;
            }
        }
        if(y==1) {
            System.out.println(((arr.length-1)/2));
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] == arr[i + 1] && flag == false) {
                flag = true;
                s = arr[i];
                sx = i;
            } else {
                e = arr[i];
                ex = i;
            }
        }
        //System.out.println(s + " " + e);
        //System.out.println(sx + " " + ex);
        /*// inline
        for (int i = sx; i < ex-1; i++) {
            if(arr[i]!=arr[i+1]) {
                x++;
            }
        }*/
        for (int i = 0; i < sx; i++) {
            if (arr[i] == arr[sx]) {
                char temp = arr[sx - 1];
                //System.out.println(arr[sx - 1]);
                arr[sx - 1] = arr[i];
                arr[i] = temp;
                sx--;
                x++;
            }
        }
        for (int i = 0; i < sx; i++) {
            if (arr[i] == e) {
                x++;
            }
        }
        System.out.println(x);
    }
}

 

標題:迷宮與陷阱

 
小明在玩一款迷宮游戲,在游戲中他要控制自己的角色離開一間由NxN個格子組成的2D迷宮。  
小明的起始位置在左上角,他需要到達右下角的格子才能離開迷宮。
每一步,他可以移動到上下左右相鄰的格子中(前提是目標格子可以經過)。
迷宮中有些格子小明可以經過,我們用'.'表示;
有些格子是牆壁,小明不能經過,我們用'#'表示。
此外,有些格子上有陷阱,我們用'X'表示。除非小明處於無敵狀態,否則不能經過。
 
有些格子上有無敵道具,我們用'%'表示。
當小明第一次到達該格子時,自動獲得無敵狀態,無敵狀態會持續K步。
之后如果再次到達該格子不會獲得無敵狀態了。  
 
處於無敵狀態時,可以經過有陷阱的格子,但是不會拆除/毀壞陷阱,即陷阱仍會阻止沒有無敵狀態的角色經過。
 
給定迷宮,請你計算小明最少經過幾步可以離開迷宮
 
 
輸入
----
第一行包含兩個整數N和K。 (1 <= N <= 1000 1 <= K <= 10)  
以下N行包含一個NxN的矩陣。
矩陣保證左上角和右下角是'.'。
 
輸出
----
一個整數表示答案。如果小明不能離開迷宮,輸出-1。
 
【樣例輸入1】
5 3
...XX
##%#.
...#.
.###.
.....
 
【樣例輸出1】
10
 
【樣例輸入2】
5 1
...XX
##%#.
...#.
.###.
.....
 
【樣例輸出2】
12
 
 
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 3000ms
 
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
 
注意:main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。
 
提交程序時,注意選擇所期望的語言類型和編譯器類型。

 code:

package the.ninth;

import java.util.LinkedList;
import java.util.Scanner;

public class E {

    private final static int MAXN = 1006;
    private static char[][] maps = new char[MAXN][MAXN];
    private static int [][][] dp=new int[MAXN][MAXN][10];

    private static int[] x = { 0, 0, 1, -1 };
    private static int[] y = { 1, -1, 0, 0 };

    private static int K = 0;
    private static int n = 0;

    public static void main(String[] args) {
        for (int i = 0; i < MAXN; i++) {
            for (int j = 0; j < MAXN; j++) {
                for (int k = 0; k < 10; k++) {
                    dp[i][j][k]=100000;
                }
            }
        }
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        K = input.nextInt();
        for (int i = 0; i < n; i++) {
            maps[i] = input.next().toCharArray();
        }
        class Nodex  {
            int x;
            int y;
            int k;
            public Nodex() {
            }
            public Nodex(int x, int y,int k) {
                this.x = x;
                this.y = y;
                this.k = k;
            }
        }

        LinkedList<Nodex> queue = new LinkedList<>();

        Nodex head = new Nodex(0, 0, 0);
        dp[0][0][0]=0;
        queue.add(head);

        while (!queue.isEmpty()) {
            Nodex cur = queue.poll();
            
            for (int i = 0; i < 4; i++) {
                int newx = cur.x + x[i];
                int newy = cur.y + y[i];
                Nodex node=new Nodex();
                node.x=newx;
                node.y=newy;
                node.k = cur.k>0? cur.k - 1 : 0;
                if(newx<0||newx>=n||newy<0||newy>=n)continue;
                if(maps[newx][newy]=='#') continue;
                if(maps[newx][newy]=='%') node.k = K-1;
                else if(maps[newx][newy] == 'X' && cur.k<=0)continue;
                if (dp[newx][newy][node.k] > dp[cur.x][cur.y][cur.k] + 1) {
                    dp[newx][newy][node.k] = dp[cur.x][cur.y][cur.k] + 1;
                    queue.push(node);
                }
                
                if (maps[cur.x][cur.y] == '%') maps[cur.x][cur.y] = '.';
            }
        }
        
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < K; i++) ans = Math.min(ans, dp[n-1][n-1][i]);
        if (ans == Integer.MAX_VALUE) System.out.println("-1");
        else System.out.println(ans);
    }
}

 


免責聲明!

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



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