//============================================================================
// Name : 1027.cpp
// Author : sww
// Version : 1.0
// Time : 2013-11-18 14:10:34
//===========================================================================
#include <stdio.h>
#include <cstring>
#include <vector>
using namespace std;
#define R 10
#define C 15
#define D 4
typedef enum color {
WHITE, GREY, BLACK
} Color;
typedef struct node {
char data;
int size;
int number;
int row;
int column;
} Node;
char data[R + 1][C + 2];
int number[R + 1][C + 1];
Color color[R + 1][C + 1];
int m[D] = { 0, 0, 1, -1 };
int n[D] = { 1, -1, 0, 0 };
vector<int*> v;
bool checkok(int r, int c) {
return r >= 1 && r <= R && c >= 1 && c <= C;
}
void sign(const int& r, const int& c, const char& dt) {
v.push_back(&number[r][c]);
color[r][c] = GREY;
for (int i = 0; i < D; i++) {
int nr = r + m[i];
int nc = c + n[i];
if (checkok(nr, nc)) {
if (color[nr][nc] == WHITE && data[nr][nc] == dt) {
sign(nr, nc, dt);
}
}
}
color[r][c] = BLACK;
}
Node sign() {
memset(number, 0, sizeof(number));
memset(color, 0, sizeof(color));
int number = 0;
int maxSize = 0;
int maxNumber = 0;
int rr = 0;
int rc = 0;
char ch = '\0';
for (int c = 1; c <= C; c++) {
for (int r = 1; r <= R; r++) {
if (color[r][c] == WHITE && data[r][c]) {
v.clear();
number++;
sign(r, c, data[r][c]);
int size = v.size();
if (size > maxSize) {
maxSize = size;
maxNumber = number;
ch = data[r][c];
rr = r;
rc = c;
}
for (vector<int*>::iterator it = v.begin(); it != v.end();
++it) {
*(*it) = number;
}
}
}
}
Node re;
re.data = ch;
re.number = maxNumber;
re.size = maxSize;
re.row = rr;
re.column = rc;
return re;
}
void output() {
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
char ch = data[R + 1 - i][j];
if (ch) {
printf("%c ", ch);
} else {
printf(" ");
}
}
puts("");
}
puts("");
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
char ch = data[R + 1 - i][j];
if (ch) {
printf("%d\t", number[R + 1 - i][j]);
} else {
printf("\t");
}
}
puts("");
}
puts("");
}
void pushDown(int num) {
int si = 1;
for (int i = 1; i <= C; i++) {
int j = 1;
for (int start = 1; start <= R; start++) {
if (number[start][i] != num && number[start][i] != 0) {
data[j++][si] = data[start][i];
}
}
if (j == 1)
continue;
else {
for (; j <= R; j++) {
data[j][si] = '\0';
}
si ++;
}
}
for (; si<= C;si++){
for (int j=1;j<=R;j++){
data[j][si] = '\0';
}
}
}
int main() {
int t;
scanf("%d", &t);
for (int tt = 1; tt <= t; tt++) {
printf("Game %d:\n\n", tt);
for (int i = 1; i <= R; i++) {
scanf("%s", &data[R + 1 - i][1]);
}
int step = 0;
int sum = 0;
int remain = R * C;
while (1) {
const Node& node = sign();
// output();
if (node.size > 1) {
step++;
int score = (node.size - 2) * (node.size - 2);
sum += score;
remain -= node.size;
printf(
"Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",
step, node.row, node.column, node.size, node.data,
score);
pushDown(node.number);
} else {
if (remain==0)
sum += 1000;
printf("Final score: %d, with %d balls remaining.\n\n", sum,
remain);
break;
}
}
}
return 0;
}
poj1027
最新推荐文章于 2020-07-22 16:02:07 发布