1. 程式人生 > 其它 >2020年09月 HNUCM-OJ演算法分析與設計作業8

2020年09月 HNUCM-OJ演算法分析與設計作業8

技術標籤:演算法分析與設計

@ZHANGQIANYI2020

HNUCM-OJ 習題6-6 楊輝三角,小白鼠,放蘋果,數字交換,棋盤覆蓋問題,整數劃分問題之備忘錄法

問題 A: 習題6-6 楊輝三角

(時間限制: 1 Sec 記憶體限制: 12 MB)

題目描述:

按要求輸出如下格式的楊輝三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多輸出10層。

輸入:

輸入只包含一個正整數n,表示將要輸出的楊輝三角的層數。

輸出:

對應於該輸入,請輸出相應層數的楊輝三角,每一層的整數之間用一個空格隔開。

樣例輸入:

5

樣例輸出:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

參考答案:

import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()) {
            int n=sc.nextInt();
            int
a[][]=new int[n+1][n+1]; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { if(i==j) { a[i][j]=1; } else if(i==1||j==1) { a[i][j]=1; }else {
a[i][j]=a[i-1][j-1]+a[i-1][j]; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { System.out.print(a[i][j]+" "); } System.out.println(); } } } }

問題 B: 小白鼠

(時間限制: 1 Sec 記憶體限制: 128 MB)
題目描述:

N只小白鼠(1 <= N <= 100),每隻鼠頭上戴著一頂有顏色的帽子。
現在稱出每隻白鼠的重量,要求按照白鼠重量從大到小的順序輸出它們頭上帽子的顏色。
帽子的顏色用“red”,“blue”等字串來表示。
不同的小白鼠可以戴相同顏色的帽子。白鼠的重量用整數表示。

輸入:

多案例輸入,每個案例的輸入第一行為一個整數N,表示小白鼠的數目。
下面有N行,每行是一隻白鼠的資訊。第一個為不大於100的正整數,表示白鼠的重量;
第二個為字串,表示白鼠的帽子顏色,字串長度不超過10個字元。
注意:白鼠的重量各不相同。

輸出:

每個案例按照白鼠的重量從大到小的順序輸出白鼠的帽子顏色。

樣例輸入:

3
30 red
50 blue
40 green

樣例輸出:

blue
green
red

參考答案:

import java.util.Scanner;  
    
public class Main {  
    public static void main(String[] args) {  
        Scanner sc=new Scanner(System.in);  
        while(sc.hasNext()) {
            int n=sc.nextInt();
            int a[]=new int[n];
            String b[]=new String[n];
            for(int i=0;i<n;i++) {
                a[i]=sc.nextInt();
                b[i]=sc.next();
            }
            for(int i=0;i<n;i++) {
                for(int j=i+1;j<n;j++) {
                    if(a[i]<a[j]) {
                        int s=a[i];
                        a[i]=a[j];
                        a[j]=s;
                        String color=b[i];
                        b[i]=b[j];
                        b[j]=color;
                    }
                }
            }
            for(int i=0;i<n;i++) {
                System.out.println(b[i]);
            }
        }
    }  
}

問題 C: 放蘋果

(時間限制: 1 Sec 記憶體限制: 128 MB)

題目描述:

把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?
(用K表示)5,1,1和1,5,1 是同一種分法。

輸入:

每行均包含二個整數M和N,以空格分開。1<=M,N<=10。

輸出:

對輸入的每組資料M和N,用一行輸出相應的K。

樣例輸入:

7 3

樣例輸出:

8

參考答案:

import java.util.Scanner;
 
public class Main{
    public static int fangpingguo(int m,int n){
        if(m==0||n==1){
            return 1;
        }
        if(n>m){
            return fangpingguo(m,m);
        }
        return fangpingguo(m,n-1)+fangpingguo(m-n,n);
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int m=sc.nextInt();
            int n=sc.nextInt();
            int s=0;
            s=fangpingguo(m,n);
            System.out.println(s);
        }
    }
}

問題 D: 數字交換

(時間限制: 1 Sec 記憶體限制: 128MB)

題目描述:

輸入一個數n,然後輸入n個數值各不相同,調換陣列中最大和最小的兩個數,然後輸出。

輸入:

測試資料有多組,輸入n(1<=n<=20),接著輸入n個數。

輸出:

對於每組輸入,輸出交換後的結果。

樣例輸入:

2
1 3

樣例輸出:

3 1

參考答案:

import java.util.Scanner;  
    
public class Main{  
    public static void main(String[] args) {  
        Scanner sc=new Scanner(System.in);  
        while(sc.hasNext()) {
            int n=sc.nextInt();
            int M=0,N=0;
            int a[]=new int[n];
            int Min=0,Max=0,MinIndex=0,MaxIndex=0;
            int temp;
            for(int i=0;i<n;i++) {
                a[i]=sc.nextInt();
            }
            for(int i=0;i<n;i++) {
                if(i==0){
                    Min=a[i];
                    Max=a[i];
                    MinIndex=i;
                    MaxIndex=i;
                }
                if(Max<a[i]){
                    Max=a[i];
                    MaxIndex=i;
                }
                if(Min>a[i]){
                    Min=a[i];
                    MinIndex=i;
                }
            }
            temp=a[MinIndex];
            a[MinIndex]=a[MaxIndex];
            a[MaxIndex]=temp;
            for(int i=0;i<n;i++){
                System.out.print(a[i]);
                if(i !=n-1){
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }  
}

問題 E: 棋盤覆蓋問題

(時間限制: 1 Sec 記憶體限制: 256MB)

題目描述:

在一個n×n (n = 2k)個方格組成的棋盤中,恰有一個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。
在棋盤覆蓋問題中,要用圖示的4種不同形態的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋。

輸入:

多組測試用例,每組測試用例包括兩部分,
第一部分為方格的寬度n,
第二部分則為方格,特殊方格為-1,其他方格為0。

輸出:

輸出覆蓋後的方案

樣例輸入:

4
-1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

樣例輸出:

-1 2 4 4
2 2 1 4
3 1 1 5
3 3 5 5

參考答案:

import java.util.Scanner;
 
public class Main {
    static int title=1;
    public static void qipanfugai(int a[][],int tr,int tc,int dr,int dc,int size){ 
        if(size==1)return;
        int t=title++;
        int s=size/2;
        if(dr<tr+s&&dc<tc+s){
            qipanfugai(a,tr,tc,dr,dc,s);
        }else{
            a[tr+s-1][tc+s-1]=t;
            qipanfugai(a,tr,tc,tr+s-1,tc+s-1,s);
        }
        if(dr>=tr+s&&dc<tc+s){
            qipanfugai(a,tr+s,tc,dr,dc,s);
        }else{
            a[tr+s][tc+s-1]=t;
            qipanfugai(a,tr+s,tc,tr+s,tc+s-1,s);
        }
        if(dr<tr+s&&dc>=tc+s){
            qipanfugai(a,tr,tc+s,dr,dc,s);
        }else{
            a[tr+s-1][tc+s]=t;
            qipanfugai(a,tr,tc+s,tr+s-1,tc+s,s);
        }
        if(dr>=tr+s&&dc>=tc+s){
            qipanfugai(a,tr+s,tc+s,dr,dc,s);
        }else{
            a[tr+s][tc+s]=t;
            qipanfugai(a,tr+s,tc+s,tr+s,tc+s,s);
        }
         
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int x = 0,y = 0;
            int n=sc.nextInt();
            int a[][]=new int[n][n];
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++){
                    a[i][j]=sc.nextInt();
                    if(a[i][j]==-1){
                        x=i;
                        y=j;
                    }
                }       
            qipanfugai(a,0,0,x,y,n);
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    System.out.print(a[i][j]+" ");
                }
                System.out.println();
            }
            title=1;
        }
    }
}

問題 F: 整數劃分問題之備忘錄法

(時間限制: 1 Sec 記憶體限制: 128MB)

題目描述:

使用備忘錄法編寫一個程式,求一個正整數n的所有劃分個數。
例如,輸入3,輸出3;輸入4,輸出5。

輸入:

多組輸入,每一組是一個正整數n。

輸出:

輸出劃分數。

樣例輸入:

3
4

樣例輸出:

3
5

參考答案:

import java.util.Scanner;  
    
public class Main {  
    static int a[][]=new int[100][100];
    static int n;
    public static int beiwanglu(int n,int m) {
        if((n<1)||(m<1)) 
            return 0;
        if((n==1)||(m==1)) 
            return 1;
        if(n<m) 
            return beiwanglu(n,n);
        if(n==m){
            if (a[n-1][n-2]==0) {
                a[n-1][n-2] = beiwanglu(n,n-1);
            }
            return 1 + a[n-1][n-2];
        }
        if (n>m) {
            if (a[n-m-1][m-1]==0) {
                a[n-m-1][m-1]=beiwanglu(n-m,m);
            }
            if (a[n-1][m-2]==0) {
                a[n-1][m-2] = beiwanglu(n,m-1);
            }
            return a[n-1][m-2] + a[n-m-1][m-1];
        }else{
            return 0;
        }     
    }
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        while(sc.hasNext()) {
            n=sc.nextInt();
            System.out.println(beiwanglu(n,n));  
        }    
    }     
}