Run Time: 0.010
Ranking (as of 2016-04-15): 24 out of 591
Language: C++
/*
UVa 1103 - Ancient Messages
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_1103_Ancient_Messages.cpp
*/
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <utility>
#include <cstdio>
#include <cctype>
using namespace std;
const int nr_dirs = 4;
const pair<int, int> dirs[nr_dirs] = {
make_pair(1, 0), make_pair(-1, 0), make_pair(0, 1), make_pair(0, -1)};
const char hieroglyph_characters[] = {0, 'W', 'A', 'K', 'J', 'S', 'D'};
const int H_max = 200, W_max = 50;
int image[H_max + 2][W_max * 4 + 2];
void bfs_black_pixels(int rows, int columns, int sr, int sc, int nr)
{
image[sr][sc] = nr;
queue< pair<int, int> > q;
q.push(make_pair(sr, sc));
while (!q.empty()) {
pair<int, int> u = q.front();
q.pop();
for (int i = 0; i < nr_dirs; i++) {
int r = u.first + dirs[i].first, c = u.second + dirs[i].second;
if (r >= 0 && r < rows && c >= 0 && c < columns && image[r][c] == 1) {
image[r][c] = nr;
q.push(make_pair(r, c));
}
}
}
}
void bfs_white_pixels(int rows, int columns, int sr, int sc, int nr,
vector< set<int> >& hieroglyphs)
{
image[sr][sc] = nr;
queue< pair<int, int> > q;
q.push(make_pair(sr, sc));
while (!q.empty()) {
pair<int, int> u = q.front();
q.pop();
for (int i = 0; i < nr_dirs; i++) {
int r = u.first + dirs[i].first, c = u.second + dirs[i].second;
if (r >= 0 && r < rows && c >= 0 && c < columns) {
if (image[r][c] == 0) {
image[r][c] = nr;
q.push(make_pair(r, c));
}
else if (image[r][c] > 0)
hieroglyphs[image[r][c] - 2].insert(nr);
}
}
}
}
int main()
{
const int nr_pixels = 4;
for (int case_nr = 1; ; case_nr++) {
int H, W;
scanf("%d %d", &H, &W);
if (!H)
break;
for (int i = 1; i <= H; i++) {
char s[W_max + 1];
scanf("%s", s);
image[i][0] = 0;
for (int j = 0, k = 1; j < W; j++, k += nr_pixels) {
int p = (isdigit(s[j])) ? s[j] - '0' : s[j] - 'a' + 10;
for (int l = 0, b = 8; l < nr_pixels; l++, b >>= 1)
image[i][k + l] = (p & b) ? 1 : 0;
}
image[i][W * nr_pixels + 1] = 0;
}
W = W * nr_pixels + 2;
for (int j = 0; j < W; j++)
image[0][j] = image[H + 1][j] = 0;
H += 2;
#ifdef DEBUG
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++)
printf("%d", image[i][j]);
putchar('\n');
}
#endif
int nr_hieroglyphs = 0;
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
if (image[i][j] == 1) {
bfs_black_pixels(H, W, i, j, nr_hieroglyphs + 2);
nr_hieroglyphs++;
}
int nr_white_areas = 0;
vector< set<int> > hieroglyphs(nr_hieroglyphs);
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
if (image[i][j] == 0) {
bfs_white_pixels(H, W, i, j, -(nr_white_areas + 1), hieroglyphs);
nr_white_areas++;
}
#ifdef DEBUG
printf("hieroglyphs: %d\n", nr_hieroglyphs);
for (int i = 0; i < nr_hieroglyphs; i++)
printf(" %d: %u\n", i, hieroglyphs[i].size());
printf("white areas: %d\n", nr_white_areas);
#endif
vector<char> codes;
for (int i = 0; i < nr_hieroglyphs; i++)
codes.push_back(hieroglyph_characters[hieroglyphs[i].size()]);
sort(codes.begin(), codes.end());
printf("Case %d: ", case_nr);
for (int i = 0; i < codes.size(); i++)
putchar(codes[i]);
putchar('\n');
}
return 0;
}
No comments:
Post a Comment