我尝试针对以下问题提出算法,但直到现在我还是无法解决它。我想这个问题属于图形问题。也许有人可以给我一个正确的关键字/算法的提示。 :)
所以我的问题:我有一组顶点和一些限制。我试图找到关于限制的顶点之间的所有边缘。
让我们来看看这个例子:
S - - -
- 1 2 -
- 3 4 -
- - - E
我可以识别路径
更复杂的例子
S - - - -
- 1 2 3 -
- 4 5 6 -
- - - - E
使用以下路径:
*在我们的用例中
人们还可以想到将具有高度B和宽度T的矩形划分为大小相等的矩形的问题。在我们的使用案例中,B和T的分离数量应该是可以修改的。请参阅图片以获取示例
答案 0 :(得分:1)
在评论中,我暗示了动态编程,如果只需要多个解决方案,这就是解决这个问题的方法。我误解了问题。
要打印所有解决方案,您必须计算所有解决方案,并通过递归完成。递归步骤具有属性gcd(x,y)= 1,因为如果它不是一个大于步骤的情况则会跳过'在一些节点上。
这是一个简单的python解决方案,它以您指定的格式打印结果。
from fractions import gcd
def valid_steps(max_x, max_y):
for x in xrange(1, max_x+1):
for y in xrange(1, max_y+1):
if gcd(x, y) == 1:
yield x, y
def _solve(n, m, path, xy_2_name):
x, y = path[-1]
if x == n and y == m:
print [xy_2_name[xy] for xy in path]
return
for sx, sy in valid_steps(n - x, m - y):
_solve(n, m, path + [(x+sx, y+sy)], xy_2_name)
def solve(n, m):
xy_2_name = dict()
xy_2_name[(1, 1)] = 'S'
xy_2_name[(n, m)] = 'E'
c = 1
for y in xrange(2, m):
for x in xrange(2, n):
xy_2_name[(x, y)] = c
c += 1
_solve(n, m, [(1, 1)], xy_2_name)
solve(5, 4)
答案 1 :(得分:0)
我不确定这是否有用,但也许您可以查看Theta *(只是google' Theta star')。我不确定这是否符合您的需求,但我觉得您只需要非贪婪的实施。
答案 2 :(得分:0)
看起来可以使用简单的最短路径算法来解决。
图表G = (V,E)
。边集E={(i,j), where row(j) > row(i) and col(j) > col(i) }
此外,请确保(Start,End)
不属于E
。然后,很容易看出该图没有定向循环。从Start
到End
的任何路径都是满足您的约束的路径。特别是,最短路径(例如,在应用Dijkstra的最短路径算法时很容易获得)满足您的约束条件。
要查找Start
和End
之间的所有路径,您需要某种枚举算法。通常,图中两个节点之间的路径数量是图形输入大小的指数。