7
Camlot 解解解解 IOI’98 Day 2 Probl em 2 解解 2003 解 7 解 12 解

Camlot 解题报告 IOI’98 Day 2 Problem 2

Embed Size (px)

DESCRIPTION

Camlot 解题报告 IOI’98 Day 2 Problem 2. 赵静 2003 年 7 月 12 日. 游戏描述. 初始状态:一个国王和 N 个骑士分布在 8*8 的棋盘上 0

Citation preview

Page 1: Camlot  解题报告 IOI’98 Day 2 Problem 2

Camlot 解题报告IOI’98 Day 2 Problem 2

赵静 2003 年 7 月 12 日

Page 2: Camlot  解题报告 IOI’98 Day 2 Problem 2

游戏描述 初始状态:一个国王和 N 个骑士分布在 8*8 的棋盘上

0 <= N <= 63

目标状态:国王和所有的骑士走到同一个格子里 游戏规则:

在一次移动中,国王可以走到相邻的八个格子里 骑士可以走八个方向的“日”字 国王和某个骑士相遇后,可以由骑士带着移动

任务:用最少的总移动步数达到目标状态。

Page 3: Camlot  解题报告 IOI’98 Day 2 Problem 2

Sample

D4A3A8H1H8

Input:

10

Output:

A B C D E F G H

8 7 6 5 4 3 2 1

Page 4: Camlot  解题报告 IOI’98 Day 2 Problem 2

分析 最短路问题

求一个点,使其到已知若干点的总路径最短

点的个数有限( 64 个),逐个枚举 国王和骑士相遇的特殊情形

国王可能和任意一个骑士在任意一点相遇 枚举 63 * 64 种可能

Page 5: Camlot  解题报告 IOI’98 Day 2 Problem 2

枚举法 预处理:用 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};

}

}

Page 6: Camlot  解题报告 IOI’98 Day 2 Problem 2

递推算法(供参考) 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 个点

Page 7: Camlot  解题报告 IOI’98 Day 2 Problem 2

THE END

Thank you for your attention!