洛谷P1930 亞瑟王的宮殿 Camelot

2022-05-01 10:45:08 字數 2446 閱讀 9895

題目提供者johnkram

標籤usaco

難度提高+/省選-

提交  討論  題解  

很久以前,亞瑟王和他的騎士習慣每年元旦去慶祝他們的友誼。為了紀念上述事件, 我們把這些故事看作是乙個棋盤遊戲。有乙個國王和若干個騎士被放置在乙個由許多方格 組成的棋盤上,沒有兩個騎士在同乙個方格內。

這個例子是標準的 8*8 棋盤

國王可以移動到任何乙個相鄰的方格,從下圖中黑子位置到下圖中白子位置前提是他 不掉出棋盤之外。

乙個騎士可以從下圖中黑子位置移動到下圖中白子位置(走「日」字形) 但前提是他 不掉出棋盤之外。

在遊戲中,玩家可在每個方格上放不止乙個棋子,假定方格足夠大,任何棋子都不會 阻礙到其他棋子正常行動。

玩家的任務就是把所有的棋子移動到同乙個方格裡——用最小的步數。為了完成這個 任務,他必須按照上面所說的規則去移動棋子。另外,玩家可以選擇乙個騎士跟國王從他 們兩個相遇的那個點開始一起行動,這時他們按照騎士的行動規則行動,其他的單獨騎士 則自己一直走到集中點。騎士和國王一起走的時候,只算乙個人走的步數。

請計算他們集中在一起的最小步數,而且玩家必須自己找出這個集中點。當然,這些 棋子可以在棋盤的任何地方集合。

輸入格式:

第一行: 兩個用空格隔開的整數:r,c 分別為棋盤行和列的長。不超過 26 列,40 行。

第二行到結尾: 輸入檔案包含了一些有空格隔開的字母/數字對,一行有乙個或以 上。第一對為國王的位置,接下來是騎士的位置。可能沒有騎士,也可能整個棋盤都是騎 士。行從 1 開始,列從大寫字母 a 開始。

輸出格式:

單獨一行表示棋子集中在乙個方格的最小步數。

輸入樣例#1:

8  8

d 4

a 3 a 8

h 1 h 8

輸出樣例#1:

10
【樣例說明】

他們集中在 b5。

騎士 1: a3 - b5 (1 步)

騎士 2: a8 - c7 - b5 (2 步)

騎士 3: h1 - g3 - f5 - d4 (此時國王開始與這個騎士一起走) - b5 (4 步) 騎士 4: h8 - f7 - d6 - b5 (3 步)

1 + 2 + 4 + 3 = 10 步

題目翻譯來自nocow。

usaco training section 3.3

分析:這道題是一道很明顯的搜尋題,因為集合點沒告訴,所以要列舉集合點,這樣的話涉及到多次計算,先進行預處理,處理每兩個點之間距離,因為是無權無向圖,用bfs就可以了,如果不考慮騎士背國王的話,只需要把所有騎士的點到集合點的距離加起來並加上國王與集合點的橫縱座標的差的最大值即可(國王可以八個方向走),如果考慮背國王的話,有點麻煩.首先你不知道是哪個騎士背國王,然後不知道在哪背,因為國王也要走動,這樣的話列舉背的騎士和背的地點,根據之前預處理好的陣列計算即可.

#include #include 

#include

#include

#include

#include

using

namespace

std;

int r, c, dis[31][27][31][27],num,ans = 100000000

;const

int dr[8] = ;

const

int dc[8] = ;

struct

node

king,qishi[

800];

bool vis[31][27

];bool check(int x, int

y)void bfs(int x,int

y) }

}}int

main()

for (int i = 1; i <= r; i++)

for (int j = 1; j <= c; j++)

for (int k = 1; k <= r; k++)

for (int l = 1; l <= c; l++)

dis[i][j][k][l] = 1000000

;

for (int i = 1; i <= r; i++)

for (int j = 1; j <= c; j++)

bfs(i, j);

for (int i = 1; i <= r; i++)

for (int j = 1; j <= c; j++)

}printf(

"%d\n

", ans);

return0;

}

題解 亞瑟王的宮殿

在此之前,該題已經有很多題解,但它們大多是列舉國王周圍 5 times 5 的範圍 玄學貪心?最後計算最小距離。雖然能 ac 但其實這種做法是不嚴謹的 詳見巨佬的hack資料 然而將 5 times 5 的範圍擴大至 r times c 的範圍後,時間複雜度過大。那麼,這道題真的無解了嗎?蒟蒻的我用...

usaco3 3 4亞瑟王的宮殿

對於騎士帶王去會合的情況,列舉王的原位置和八個方向,也就是說王和騎士的匯合點相對於王的原位置為上下左右或者斜45度方向。比如在8 8的棋盤上,王的位置用k表示,需要列舉的帶王的點用1表示,其餘點用0表示則有下圖 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 ...

題解 洛谷P1738 洛谷的資料夾

一 目錄概覽 二 題目大意 三 大致思路 四 實現 五 剖析 六 總結回顧 kkksc03想好了很多應該有的資料夾路徑名。問題是,需要是使這些資料夾都存在,需要新建幾個資料夾呢?資料夾路徑是什麼?例如 a b c,表示在根目錄下有a資料夾,在a資料夾裡有b資料夾,在b資料夾裡有c資料夾。其他路徑同理...