我正在解决问题CCHESS,这是问题的链接(http://www.spoj.pl/problems/CCHESS/)。
问题如下:
在罗马的国家,国际象棋是一场皇家游戏。对于evey移动,玩家必须给皇帝Jurg一些钱。 LGM或小绿人,是非常好的国际象棋选手。但是因为国际象棋是一场昂贵的比赛,这就是为什么它是王室的,他们要求你帮助他们找到他们为将骑士从一个位置移动到另一个位置所必须支付的最低限度。可以使用任意数量的步骤到达目的地。
约束:
国际象棋的维度为8X8,左下角的索引为(0,0)。
骑士只能以标准方式移动,即2行1列或1行2列。
如果在步骤中Knight从(a,b)移动到(c,d),则LGM必须向Emperor Jurg支付* c + b * d美元。
0 ≤ a, b, c, d ≤ 7
输入
有100-150个测试用例。每个测试用例由四个空格的整数组成。前两个数字a,b是骑士的起始位置,接下来的两个,c,d,是骑士的目的地。读到文件结尾。 输出
对于每个测试用例,打印他们必须在单独行中支付的最低金额。如果无法到达目的地,则打印-1。
实施例
输入:
2 5 5 2
4 7 3 2
1 2 3 4
输出:
42 78 18
测试用例#1的说明: 2 5 5 2
移动骑士 (2,5)至(5,2)
in minimum cost, one of the path is
(2, 5) -> (3, 3) ->(5, 2)
雄鹿支付:
(2, 5) = 0
(2, 5) -> (3, 3) = 0 + (2*3 + 5*3) = 21
(3, 3) -> (5, 2) = 21 + (3*5 + 3*2) = 42
无限及超越......
我使用暴力来完成这个问题,即递归检查所有可能的路径,但我认为我在某处找不到直接的方法,因为我的递归方法在0.3s内接受了许多提交的0.00。 任何帮助将不胜感激。
答案 0 :(得分:2)
Construct a graph G=(V,E) where
V is the set of coordinates in the grid {v=(x,y)}
E is the set of edges between vertices
Assign weights on the edges where weight is (v1.x * v2.x + v1.y*v2.y)
Use Dijkstra's algorithm to find the shortest path (1 source - 1 destination)
source = (a,b) and destination = (c,d)
If there is no path report -1.
The number of vertices are limited to (8*8) = 64
The number of edges are limited to 64 * (8) = 512
as the knight can move to at most 8 other coordinates from one place.
答案 1 :(得分:0)
尝试A *算法,启发式= manhattan_distance / 3。