# 題目: UVa 168 - Theseus and the Minotaur

# 題目說明

一個勇者正在迷宮中追逐怪物,怪物會怕光線
勇者每隔一段距離就會插上一個蠟燭,怪物就不會走到那裡
持續下去,怪物最終會被困在一個地方
求所有蠟燭的位置及怪物最後被困住的位置
(怪物會優先往字母小 (a) 的地方走)


INPUT:
每筆資料會先有一個字串,代表能走的路
接著會有兩個字元 mt 和一個整數 k

  1. m 代表怪物一開始的位置
  2. t 代表勇者一開始的位置
  3. 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/