Ranking (as of 2013-09-22): 22 out of 789
Language: C++
/*
UVa 168 - Theseus and the Minotaur
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_168_Theseus_and_the_Minotaur.cpp
*/
#include <cstdio>
const int nr_letters = 26;
struct cavern {
int reachables_[nr_letters + 1];
bool candle_;
} caverns[nr_letters];
int main()
{
const int nr_chars_max = 255;
char s[nr_chars_max + 1];
while (true) {
scanf("%s", s);
if (s[0] == '#')
break;
cavern caverns[nr_letters];
for (int i = 0; i < nr_letters; i++) {
caverns[i].reachables_[0] = -1;
caverns[i].candle_ = false;
}
for (const char* p = s; *p; p++) {
int i = *p++ - 'A', j = 0;
for (p++; *p >= 'A' && *p <= 'Z'; p++)
caverns[i].reachables_[j++] = *p - 'A';
caverns[i].reachables_[j] = -1; // terminator
}
char mc[1 + 1], tc[1 + 1];
int mi, pmi, k, ki = 1;
scanf("%s %s %d", mc, tc, &k);
mi = mc[0] - 'A', pmi = tc[0] - 'A';
int np = 0, passed[nr_letters];
while (true) {
#ifdef DEBUG
printf("%d %d\n", pmi, mi);
#endif
if (pmi == mi) {
if (!caverns[mi].candle_)
passed[np++] = mi;
break;
}
if (ki == k) {
ki = 0;
#ifdef DEBUG
printf("%d\n", mi);
#endif
caverns[mi].candle_ = true;
passed[np++] = mi;
}
const int* pc;
for (pc = caverns[mi].reachables_; *pc != -1; pc++)
if (*pc != pmi && !caverns[*pc].candle_)
break;
if (*pc == -1) {
if (!caverns[mi].candle_)
passed[np++] = mi;
break;
}
else {
pmi = mi;
mi = *pc;
ki++;
}
}
for (int i = 0; i < np; i++) {
if (i)
putchar(' ');
if (i == np - 1)
putchar('/');
putchar(passed[i] + 'A');
}
putchar('\n');
}
return 0;
}
No comments:
Post a Comment