算法分析课设(六)跳跃问题

题目

某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
#include

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(2^{n})

你可能感兴趣的:(算法设计与分析)