抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

計算機程式設計1 的作業4 - 跳格子

題目簡述

  • 輸入會給總共要跳幾格

  • 一次可以跳1~4格,只能往前跳

  • 若總共跳10格已內,最多跳7次;總共跳11~20格,最多跳17次;總共跳21~30格,最多跳27次

  • 跳的步數從最小排序,如:(1,1,3), (1,3,1), (3,1,1) 都視為是 (1,1,3)(算同一種跳法)

    題目輸出

  • 印出有幾種跳法

解題想法

  • 基本上是一個遞迴的題目,可以從上面往下拆或是從下面往上加
  • 從上往下拆
    假設左邊的步數應該大於等於右邊的步數(就是只拆左邊)
    以跳 5 格為例
    This is a picture without description
    所以 return 的順序應該為:
    (1,1,1,1,1) (2,1,1,1) (3,1,1) (2,2,1) (4,1) (3,2)
    注意有一個 min 去紀錄正在計算的那一步是否有大於 min,避免重複計算排序錯誤的跳法
    如紅色星號地方,min為 2,但是因為 right 小於 2,所以 return 0,就是避免算到 (2,1,2)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    /*****************************************
    Filename:cp1_hw4_1.c
    Author:Willy Chen(willychen.org)
    Date:2018.01.15
    *****************************************/
    #include <stdio.h>
    int hop(int,int,int,int); /*prototype*/
    int main(void){
    int answer1;
    int pos=0;
    while(scanf("%d",&pos)!=EOF){
    if(pos<=10)
    answer1 = hop(pos,0,pos,7);
    else if (pos>10&&pos<=20)
    answer1 = hop(pos,0,pos,17);
    else if(pos>20&&pos<=30)
    answer1 = hop(pos,0,pos,27);
    printf("%d\n", answer1);
    }
    return 0;
    }

    int hop(int left,int right,int min,int step){
    int jump=0;
    if(step==0) /*you have no more steps*/
    return 0;
    if(right!=0)
    if(left < min || right < min) /*check if the left and right are smaller than min*/
    return 0;
    if(left==1&&right==1)
    return 1;
    for(int i=left-1;i>=left/2&&i>=left-i;i--){
    if(right==0) right=left-i;
    jump += hop(i,left-i,right,step-1);
    }
    if(left<=4&&right<=4) /*this jump should also be calculated*/
    jump++;
    return jump;
    }
  • 從下往上加
    從 1 開始一步一步測試
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    /*****************************************
    Filename:cp1_hw4_2.c
    Author:Willy Chen(willychen.org)
    Date:2018.01.15
    *****************************************/
    #include <stdio.h>
    int hop(int,int,int,int,int,int); /*prototype*/
    int main(void){
    int answer1=0;
    int input;
    while(scanf("%d",&input)!=EOF){
    answer1=0;
    int step;
    switch(input){
    case 1 ... 10:
    step=7;
    break;
    case 11 ... 20:
    step=17;
    break;
    case 21 ... 30:
    step=27;
    break;
    }
    for(int i=1;i<=4;i++)
    answer1 += hop(input,0,i,1,step,0);
    printf("%d\n", answer1);
    }
    return 0;
    }

    int hop(int all,int now,int add,int step,int maxn_step,int min){
    int ans = 0;
    if(step>maxn_step) /*you have no more steps*/
    return 0;
    if(add<min) /*check if the add is smaller than min*/
    return 0;

    now += add;
    if(now>all)
    return 0;

    if(all==now){
    ans++;
    return ans;
    }
    for(int i=1;i<=4;i++)
    ans += hop(all,now,i,step+1,maxn_step,add);
    return ans;
    }

評論




本站使用 Volantis 作為主題