演算法分析課設(六)跳躍問題
阿新 • • 發佈:2021-01-12
技術標籤:演算法設計與分析
題目
某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; }
演算法複雜度: