USACO 3.3.3

来源:互联网 发布:微信网络怎么报警 编辑:程序博客网 时间:2024/06/05 00:44

很恶心的搜索...纠结了两天.

本来是一个简单的最短路问题,直接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]

 

 

  

 

原创粉丝点击