有一个用矩阵表示的岛。你在岛上的某个位置(x,y)
。如果你跳n
时间,你能活下来的概率是多少?生存意味着n
跳跃后你必须在岛上。
我的解决方案:我申请flood fill algorithm
了允许在各个方向(即 N、W、E、S)移动并检查在n
跳跃之前我是否离开岛然后增加 failure
计数器,否则增加success
计数器。
在迭代所有可能的路径之后,答案是((成功)/(成功+失败))。这需要指数级的时间。
我的问题是我们可以通过使用动态编程或任何其他编程技术在多项式时间内解决这个问题吗?如果是,您能告诉我该技术背后的概念吗?
编辑:我的代码
#include<iostream>
using namespace std;
double probability_of_survival(int n, int m, int x, int y, int jumps) {
int success = 0;
int failure = 0;
probability_of_survival_utility_func(n, m, x, y, 0, jumps, &sucess, &failure);
return (double)((success)/(failure+success));
}
void probability_of_survival_utility_func(int n, int m, int x, int y, int jump_made, int jumps, int *success, int *failure) {
if(x > m || x < 0 || y > n || y < 0) { (*failure)++; return;}
if(jump_made == jumps) { (*success)++; return;}
probability_of_survival_utility_func(n, m, x+1, y, jump_made++, jumps, success, failure);
probability_of_survival_utility_func(n, m, x, y+1, jump_made++, jumps, success, failure);
probability_of_survival_utility_func(n, m, x-1, y, jump_made++, jumps, success, failure);
probability_of_survival_utility_func(n, m, x, y-1, jump_made++, jumps, success, failure);
}