题目
某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;
}
算法复杂度: