Ranking (as of 2014-10-27): 27 out of 445
Language: C++
/*
UVa 604 - The Boggle Game
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_604_The_Boggle_Game.cpp
*/
#include <iostream>
#include <set>
#include <cstring>
using namespace std;
const int nr_rows = 4, nr_columns = 4;
const int nr_letters = 4;
char first_board[nr_rows][nr_columns], second_board[nr_rows][nr_columns];
bool visited[nr_rows][nr_columns];
struct pigewu {
char s_[nr_letters + 1];
bool operator<(const pigewu& p) const {return strcmp(s_, p.s_) < 0;}
};
inline bool is_vowel(char c)
{
return c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'Y';
}
void boggle(int r, int c, int l, int vl, pigewu& p, char board[nr_rows][nr_columns],
set<pigewu>& pigewus)
{
const int nr_dirs = 8;
const int dirs[nr_dirs][2] =
{{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
p.s_[l++] = board[r][c];
if (is_vowel(p.s_[l - 1]))
vl++;
visited[r][c] = true;
if (l == nr_letters) {
p.s_[nr_letters] = '\0';
pigewus.insert(p);
}
else {
for (int i = 0; i < nr_dirs; i++) {
int nr = r + dirs[i][0], nc = c + dirs[i][1];
if (nr < 0 || nr >= nr_rows || nc < 0 || nc >= nr_columns || visited[nr][nc])
continue;
bool vowel = is_vowel(board[nr][nc]);
if (vl == 2 && vowel || l == 2 && vl == 0 && !vowel ||
l == 3 && vl == 1 && !vowel)
continue;
boggle(nr, nc, l, vl, p, board, pigewus);
}
}
visited[r][c] = false;
}
int main()
{
bool printed = false;
while (true) {
char c;
cin >> c;
if (c == '#')
break;
cin.unget();
if (printed)
cout << endl;
else
printed = true;
for (int r = 0; r < nr_rows; r++) {
for (int c = 0; c < nr_columns; c++)
cin >> first_board[r][c];
for (int c = 0; c < nr_columns; c++)
cin >> second_board[r][c];
}
pigewu p;
set<pigewu> first_pigewus, second_pigewus;
for (int r = 0; r < nr_rows; r++)
for (int c = 0; c < nr_columns; c++) {
memset(visited, 0, sizeof(visited));
boggle(r, c, 0, 0, p, first_board, first_pigewus);
memset(visited, 0, sizeof(visited));
boggle(r, c, 0, 0, p, second_board, second_pigewus);
}
size_t nr_first_pigewus = first_pigewus.size(),
nr_secont_pigewus = second_pigewus.size();
bool found = false;
if (nr_first_pigewus && nr_secont_pigewus) {
if (nr_first_pigewus > nr_secont_pigewus) {
for (set<pigewu>::const_iterator i = second_pigewus.begin(),
e = second_pigewus.end(); i != e; ++i)
if (first_pigewus.find(*i) != first_pigewus.end()) {
found = true;
cout << i->s_ << endl;
}
}
else {
for (set<pigewu>::const_iterator i = first_pigewus.begin(),
e = first_pigewus.end(); i != e; ++i)
if (second_pigewus.find(*i) != second_pigewus.end()) {
found = true;
cout << i->s_ << endl;
}
}
}
if (!found)
cout << "There are no common words for this pair of boggle boards.\n";
}
return 0;
}