Upload
deborah-mcintosh
View
128
Download
0
Embed Size (px)
DESCRIPTION
Camlot 解题报告 IOI’98 Day 2 Problem 2. 赵静 2003 年 7 月 12 日. 游戏描述. 初始状态:一个国王和 N 个骑士分布在 8*8 的棋盘上 0
Citation preview
Camlot 解题报告IOI’98 Day 2 Problem 2
赵静 2003 年 7 月 12 日
游戏描述 初始状态:一个国王和 N 个骑士分布在 8*8 的棋盘上
0 <= N <= 63
目标状态:国王和所有的骑士走到同一个格子里 游戏规则:
在一次移动中,国王可以走到相邻的八个格子里 骑士可以走八个方向的“日”字 国王和某个骑士相遇后,可以由骑士带着移动
任务:用最少的总移动步数达到目标状态。
Sample
D4A3A8H1H8
Input:
10
Output:
A B C D E F G H
8 7 6 5 4 3 2 1
分析 最短路问题
求一个点,使其到已知若干点的总路径最短
点的个数有限( 64 个),逐个枚举 国王和骑士相遇的特殊情形
国王可能和任意一个骑士在任意一点相遇 枚举 63 * 64 种可能
枚举法 预处理:用 Floyd 算法求出骑士在任意两点间的最短路径 枚举过程: O ( 64 * 64 * N)
ans = INT_MAX;
for ( i 取遍棋盘上的 64 个点 ) {
sum = 每个骑士到 i 的距离之和 ;
for ( j 取遍棋盘上的 64 个点 ) {
tmp1 = 国王到点 j 的距离 ; // 怎样计算?tmp2 = min { 骑士 k 经过 j 到 i 的距离 - 骑士 k 到 i 的距离 };
// k 取遍所有骑士ans = min {ans, sum + tmp1 + tmp2};
}
}
递推算法(供参考) CK [ i ] [ j ] 骑士从 i 到 j 的距离 CKK [ i ] [ j ] 国王从 i 到 j 的距离 CG [ i ] = sum { CK [ knight [ j ] ] [ i ] } , j 取遍所有骑士
所有骑士在 i 相遇的总距离 MKK [ i ] [ j ] = CK [ knight [ i ] ] [ j ] + CKK [ king ] [ j ]
国王和第 i 个骑士在 j 相遇的距离 MKM [ i ] [ j ] = min { MKK [ i ] [ k ] + CK [ k ] [ j ] + CG [ j ] – CK [ kn
ight [ i ] ] [ j ] }
第 i 个骑士带着国王和其它骑士在 j 相遇的总距离 ans = min { MKM [ i ] [ j ] } , i 取遍所有骑士, j 取遍 64 个点
THE END
Thank you for your attention!