我正在尝试打印导致答案的步骤,但没有到达任何地方。请参考此图片:
我能够检查给定的问题是否可以解决:
bool Solvable(int a[], int index, int target, int sz, int b[]) {
static int b_ind = 0;
if (target == 0 && index == sz-1)
return true;
if (index >= sz || index < 0)
return false;
int u_ind = index+a[index];
int d_ind = index-a[index];
bool u_y = Solvable(a,u_ind,a[u_ind],sz,b);
if (u_y) {
b[b_ind++] = u_ind;
return u_y; }
else {
bool d_y = Solvable(a,d_ind,a[d_ind],sz,b);
if (d_y) {
b[b_ind++] = d_ind;
return d_y; }
}
}
但是无法打印为正确解决方案而访问的索引序列。
答案 0 :(得分:0)
要做的两件事:
if (target == 0 && index == sz-1)
,显示b
变量。 b
是您存储探索路径的地方吗?false
时,您必须递减b_ind
注意:您的代码有点可疑,因为上一个if
没有任何其他内容;这是缺失的:
if (d_y) {
b[b_ind++] = d_ind;
return d_y;
} /* the following block is missing */
else
{
b_ind--;
return false;
}
答案 1 :(得分:0)
您无法在途中打印索引,因为您事先并不知道是否会找到解决方案。所以你需要做的是,在你的递归调用中,传递一个列表(&#34;路径&#34;)的访问位置。确保您不会更改现有路径,但实际上是在创建副本。
此外,您可能希望在找到第一个解决方案之后继续搜索,有时候不止一个。
一个问题是你可能会根据输入的谜题永远循环。这就是为什么拥有路径实际上有益的原因,因为它允许您检测循环。
在可执行的伪代码(他们称之为Python)中,它就像:
def puzzle(lst):
def solve(pos, path):
if 0 <= pos < length: # position is inside puzzle
if pos not in path: # we've already been here; prevent looping
val = lst[pos]
newpath = path + [pos] # newpath is a *copy* of path with pos appended
if val == 0: # we've found one solution
print(newpath)
else:
solve(pos-val, newpath)
solve(pos+val, newpath)
length = len(lst)
solve(0, [])
puzzle([3, 6, 4, 1, 3, 4, 2, 5, 3, 0])
对于您的示例,这会产生:
[0, 3, 2, 6, 8, 5, 9]
[0, 3, 4, 1, 7, 2, 6, 8, 5, 9]
[0, 3, 4, 7, 2, 6, 8, 5, 9]