# 題目: UVa 168 - Theseus and the Minotaur
# 題目說明
一個勇者正在迷宮中追逐怪物,怪物會怕光線
勇者每隔一段距離就會插上一個蠟燭,怪物就不會走到那裡
持續下去,怪物最終會被困在一個地方
求所有蠟燭的位置及怪物最後被困住的位置
(怪物會優先往字母小 (a) 的地方走)
INPUT:
每筆資料會先有一個字串,代表能走的路
接著會有兩個字元 m
、 t
和一個整數 k
m
代表怪物一開始的位置t
代表勇者一開始的位置k
代表每走幾步會插一個蠟燭
當字串為#
時結束
OUTPUT:
有插蠟燭的位置及怪物最後被困住的位置
# 解題方法
先將地圖建表, :
前的位置指到 :
後的位置
接著跑 dfs
,用 step
記步,當 step = k
時,輸出當前位置並在 light
中標為 true
當下一步為勇者的位置及蠟燭未點亮,呼叫下一層 dfs
最後輸出怪物當前位置
# 參考程式碼
#include <iostream> | |
#include <vector> | |
using namespace std; | |
vector< vector<char> > graph; | |
vector<bool> light; | |
int step, k; | |
void dfs(char m, char t) | |
{ | |
if (step && step % k == 0) cout << t << " ", light[t- 'A'] = true; | |
for (size_t i = 0; i < graph[m - 'A'].size(); ++i) | |
if (graph[m - 'A'][i] != t && !light[graph[m - 'A'][i] - 'A']) { | |
++step, dfs(graph[m - 'A'][i], m); | |
return; | |
} | |
cout << "/" << m << "\n"; | |
} | |
int main() | |
{ | |
ios::sync_with_stdio(false); | |
cin.tie(nullptr); | |
cout.tie(nullptr); | |
string in; | |
char m, t; | |
while (cin >> in && in != "#") { | |
graph.assign(26, vector<char>()); | |
light.assign(26, false); | |
step = 0; | |
cin >> m >> t >> k; | |
for (size_t i = 0; i < in.size();) | |
if (in[i++] == ':') { | |
auto p = i - 2; | |
while (in[i] != ';' && in[i] != '.') graph[in[p] - 'A'].emplace_back(in[i++]); | |
} | |
dfs(m, t); | |
} | |
return 0; | |
} |
# 參考資料
https://www.larrysprognotes.com/UVa%20-%20168/