【题目】
有一个M*N的梅花桩阵,每个桩都有允许跳跃的最大步数,用户从(0,0)的位置开始跳跃,允许向右和向下两个方向跳跃,求最少要跳跃多少次能达到(M-1,N-1)的位置,无法到达目的地时返回-1.M<=100,N<=100,每个桩上允许跳跃的最大步数均小于10的正整数,0表示不允许跳跃到该位置。
【示例】
输入3*3的梅花桩。
输入: 3,3
3,2,2,0,1,0,1,1,1
输出:2
参考代码:
#include <iostream>
#include <string>
#include <vector>
using std::string;
using std::vector;
/**
* m - 行
* n - 列
* list - m*n的梅花阵
* return - int 走到最后一格的步数
* TO DO - 已按照题目要求实现。但只能预测1步,无法预测2步及其以上
*/
int jumpStepNum(int m, int n, vector<int>& list)
{
int size = list.size();
if (size < 2) {
return 0;
}
int step = 0;
int current_can_move = 0;
for (int i = 0; i < size;) {
current_can_move = list[i];
int index_right = (i + current_can_move) < ((i / n + 1) * n - 1) ? (i + current_can_move) : ((i / n + 1) * n - 1);
int index_down = (i + current_can_move * n) / n < (m - 1) ? (i + current_can_move * n) : (i + (m - 1 - (i / n)) * n);
LOOP1:
if (list[index_right] == 0) {
index_right -= 1;
goto LOOP1;
}
LOOP2:
if (list[index_down] == 0) {
index_down -= n;
goto LOOP2;
}
if (index_right == i && index_down == i) {
return -1;
}
if (index_right == i) {
i = index_down;
step++;
if (i == (size - 1)) {
return step;
}
continue;
}
if (index_down == i) {
i = index_right;
step++;
if (i == (size - 1)) {
return step;
}
continue;
}
if (index_right != i && index_down != i) {
if (list[index_right] > list[index_down]) {
i = index_right;
}
else {
i = index_down;
}
}
step++;
if (i == (size - 1)) {
return step;
}
}
}
int main()
{
// 省去键入数据
/*
// 用例1
vector<int> matrix {3, 2, 2, 0, 1, 0, 1, 1, 1};
int num = jumpStepNum(3, 3, matrix);
*/
/*
// 用例2
vector<int> matrix {3, 2, 2, 2, 1, 1, 0, 2, 1, 2, 2, 3, 5, 7, 0, 3, 0, 0, 0, 1};
int num = jumpStepNum(4, 5, matrix);
*/
// 用例3
vector<int> matrix {3, 2, 2, 0, 1, 1, 0, 1, 1, 1, 0, 1, 4, 0, 1};
int num = jumpStepNum(5, 3, matrix);
std::cout << num;
return 0;
}
PS 有趣的题目