很恶心的搜索...纠结了两天.
本来是一个简单的最短路问题,直接BFS或者SPFA或者什么别的都可以,但是题目中增加了王.而王的行动方式有三种:
1.王在骑士的路上,和骑士到汇合点
2.王走到骑士的路上,和骑士到汇合点
3.王自己去汇合点
前两种情况可以合并成一种,f[i,j][x,y]+f[x,y][m,n]-f[i,j][m,n]+max(abs(king.x-x),abs(king.y-y))
枚举每个骑士的出发点[i,j]和汇合点[m,n],以及王和骑士的交汇点[x,y],计算王到交汇点[x,y]需要走的距离.-f[i,j][m,n]可以视为将被枚举骑士走的路线重新计算(显然骑士原来走的距离是[i,j][m,n]).
第三种情况,王自己走过去的话就直接max(abs(king.x-m),abs(king.y-n)),加上总距离,取最小值即可.
一个比较重要的剪枝是,王和骑士的交汇点在王坐标±2的范围内,似乎是大牛们实验得出的结果.
需要特别说明的是坐标,题目中的r表示行数,c表示列数,后面的字母表示所在列,字母表示所在行.
需要注意的是,此类题目必须先建立并分析好大致模型,然后编写,进而剪枝,采用迭代式开发.
BTW,USACO不支持函数名重载,因此自己写abs的话会和<stdlib.h>里的abs冲突,进而编译错误.
Executing...
Test 1: TEST OK [0.011 secs, 6476 KB]
Test 2: TEST OK [0.011 secs, 6476 KB]
Test 3: TEST OK [0.011 secs, 6480 KB]
Test 4: TEST OK [0.043 secs, 6476 KB]
Test 5: TEST OK [0.205 secs, 6480 KB]
Test 6: TEST OK [0.313 secs, 6476 KB]
Test 7: TEST OK [0.011 secs, 6476 KB]
Test 8: TEST OK [0.011 secs, 6480 KB]
Test 9: TEST OK [0.119 secs, 6476 KB]
Test 10: TEST OK [0.464 secs, 6476 KB]
Test 11: TEST OK [0.022 secs, 6480 KB]
Test 12: TEST OK [0.000 secs, 6480 KB]
Test 13: TEST OK [0.022 secs, 6480 KB]
Test 14: TEST OK [0.000 secs, 6476 KB]
Test 15: TEST OK [0.011 secs, 6476 KB]
Test 16: TEST OK [0.011 secs, 6476 KB]
Test 17: TEST OK [0.022 secs, 6480 KB]
Test 18: TEST OK [0.011 secs, 6476 KB]
Test 19: TEST OK [0.011 secs, 6476 KB]
Test 20: TEST OK [0.000 secs, 6476 KB]
All tests OK.
Your program ('camelot') produced all correct answers! This is your
submission #7 for this problem. Congratulations!
[Code]