1. 程式人生 > 其它 >演算法分析課設(六)跳躍問題

演算法分析課設(六)跳躍問題

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

題目

某n*n的棋盤的每個格子中都有1到9個整數。從棋盤的左上角出發,向右或向下每次跳躍格子所指定的格數,判斷是否能夠到達棋盤的右下角。如果能,輸出true, 否則輸出false。

輸入:

輸入第一行為整數n,表示棋盤方格的數量。其後的n行,各行均有n個數字。表示在該方格中可以向下或向右跳躍的方格數。

輸出:

輸出1行,true或者false。true表示從左上角可以跳躍到右下角,否則為false。

樣例輸入:

7

2 5 1 6 1 4 1

6 1 1 2 2 9 3

7 2 3 2 1 3 1

1 1 3 1 7 1 2

4 1 2 3 4 1 2

3 3 1 2 3 4 1

1 5 2 9 4 7 1

樣例輸出:

true

要求

1、寫出求解樣例輸入時的求解過程。

2、寫出演算法分析過程,編寫程式求解上述問題,並分析演算法的時間複雜度。

參考題解

這道題是一維陣列的,但它是前後跳,本題是右下跳,思路是差不多的,類似深度遍歷。

https://leetcode-cn.com/problems/jump-game-iii/solution/dfs-by-llj-666/

分析

比較簡單,看程式碼就能懂,不分析了。

#include<stdio.h>
#include<stdlib.h>

int n,flag = 0;
int i = 0, j = 0;
int **arr;

void jump(int i,int j) {
    // 結束條件1:成功了
    if (i == n-1 && j == n-1) {
        flag = 1;
        return;
    }
    // 結束條件2:碰壁了,退回上一步
    if (i >= 7 || j >= 7) {
        return;
    }
    // 結束條件2:成功了就別再走了
    if (flag == 1){
        return;
    }
    //向右移動
    jump(i, j + arr[i][j]);
    //向下移動 
    jump(i + arr[i][j], j);  
}

int main() {
    scanf("%d", &n);
    // 動態生成二維陣列
    arr = (int **)malloc(n*sizeof(int *));
    for (int i = 0; i < n;i++)
        arr[i] = (int*)malloc(n*sizeof(int));
    // 填入棋盤數字
    for (int row = 0; row < n; row++)
        for (int col = 0; col < n; col++)
            scanf("%d", &arr[row][col]);
    // 進行跳躍
    jump(i,j);
    // 輸出
    flag == 1 ? printf("true\n") : printf("false\n");
    return 0;
}

演算法複雜度:O(n^{2})