poj1027

//============================================================================
// 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;
}

猜你喜欢

转载自blog.csdn.net/swwlqw/article/details/16809927