Skip to content

Instantly share code, notes, and snippets.

@sawaken
Created November 14, 2014 05:34
Show Gist options
  • Save sawaken/f714edc0cb3d69c8a6f4 to your computer and use it in GitHub Desktop.
Save sawaken/f714edc0cb3d69c8a6f4 to your computer and use it in GitHub Desktop.
My answer-programs submitted to online-judge and got TLE.
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <utility>
using namespace std;
typedef vector<vector<char> > B;
typedef pair<int, int> P;
int dc[] = {0, 1, 0, -1};
int dr[] = {1, 0, -1, 0};
bool visited[15][10];
bool inner(B& b, int c, int r) {
return 0 <= c && c < b.size() && 0 <= r && r < b[c].size();
}
vector<P> cluster(B& b, int c, int r, char col) {
vector<P> res(0);
if (!inner(b, c, r) || b[c][r] != col || visited[c][r]) return res;
visited[c][r] = true;
res.push_back(P(c, r));
for (int i = 0; i < 4; i++) {
int nc = c + dc[i], nr = r + dr[i];
vector<P> rest_mem = cluster(b, nc, nr, col);
res.insert(res.end(), rest_mem.begin(), rest_mem.end());
}
return res;
}
void fall(vector<char>& v) {
while (find(v.begin(), v.end(), 0) != v.end())
v.erase(find(v.begin(), v.end(), 0));
}
void pack(B& v) {
for (int i = 0; i < v.size(); i++)
if (v[i].size() == 0)
v.erase(v.begin() + i--);
}
int main() {
int CASES;
cin >> CASES;
for (int case_num = 1; case_num <= CASES; case_num++) {
printf("Game %d:\n\n", case_num);
B b(15, vector<char>(10));
for (int i = 9; i >= 0; i--)
for (int j = 0; j < 15; j++)
cin >> b[j][i];
int remain_balls = 150, total_score = 0, move_num = 1;
while (remain_balls > 0) {
memset(visited, false, sizeof(visited));
vector<P> max_member;
for (int c = 0; c < b.size(); c++) {
for (int r = 0; r < b[c].size(); r++) {
vector<P> clus_member = cluster(b, c, r, b[c][r]);
if (clus_member.size() > max_member.size())
max_member = clus_member;
}
}
int n = max_member.size(), c = max_member[0].first, r = max_member[0].second;
char col = b[c][r];
if (n == 1) break;
for (int i = 0; i < n; i++)
b[max_member[i].first][max_member[i].second] = 0;
for (int i = 0; i < b.size(); i++)
fall(b[i]);
pack(b);
printf("Move %d at (%d, %d): removed %d balls of color %c, got %d points.\n",
move_num++, r + 1, c + 1, n, col, (2 - n) * (2 - n));
remain_balls -= n;
total_score += (2 - n) * (2 - n);
}
if (remain_balls == 0) total_score += 1000;
printf("Final score: %d, with %d balls remaining.\n\n", total_score, remain_balls);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment