1027

来源:互联网 发布:咕咕收音机 mac 编辑:程序博客网 时间:2024/05/18 01:45
#include <cstdio>#include <string>using namespace std;struct node{node(): colour(0), block_num(0), acc(0), leftmost(0), bottommost(0){}char colour;int block_num;int acc;int leftmost;int bottommost;};inline void select(node &chosen, node &abandon){if(chosen.acc < abandon.acc || (chosen.acc == abandon.acc && (chosen.leftmost > abandon.leftmost || (chosen.leftmost == abandon.leftmost && chosen.bottommost > abandon.bottommost)))){swap(chosen, abandon);}}void input(char (&block)[15][11]){char tmp[16];for(int i = 0; i < 10; ++i){scanf("%s", tmp);for(int j = 0; j < 15; ++j){block[j][9 - i] = tmp[j];}}}int dfs(const char (&block)[15][11], int (&visited)[15][10], const int row, const int col, const char colour, const int block_num){if(colour != block[col][row] || visited[col][row] != 0){return 0;}int acc = 1;visited[col][row] = block_num;if(row != 0){acc += dfs(block, visited, row - 1, col, colour, block_num);}if(row != 9){acc += dfs(block, visited, row + 1, col, colour, block_num);}if(col != 0){acc += dfs(block, visited, row, col - 1, colour, block_num);}if(col != 14){acc += dfs(block, visited, row, col + 1, colour, block_num);}return acc;}void compress(const int remove_block, char (&block)[15][11], const int (&visited)[15][10]){int nonemptyrow = 0;for(int tryrow = 0, col; tryrow < 15 && visited[tryrow][0] != 0; ++tryrow){char tmp[10] = {0};col = 0;for(int j = 0; j < 10 && visited[tryrow][j] != 0; ++j){if(visited[tryrow][j] != remove_block){tmp[col] = block[tryrow][j];++col;}}if(col != 0){memcpy(block[nonemptyrow], tmp, sizeof(tmp));++nonemptyrow;}}for(; nonemptyrow < 15 && visited[nonemptyrow][0] != 0; ++nonemptyrow){memset(block[nonemptyrow], 0, 10);}}int main(){int n = 0;char block[15][11] = {0};scanf("%d", &n);for(int game = 1; game <= n; ++game){input(block);printf("Game %d:\n\n", game);int remain = 150, score = 0;for(int move = 1; true; ++move){int visited[15][10] = {0}, block_num = 1;bool done = true;node t1, t2;for(int i = 0; i < 15 && block[i][0] != 0; ++i){for(int j = 0; j < 10 && block[i][j] != 0; ++j){if(visited[i][j] != 0){continue;}t1.colour = block[i][j];t1.block_num = block_num;t1.leftmost = i + 1;t1.bottommost = j + 1;t1.acc = dfs(block, visited, j, i, t1.colour, block_num);++block_num;if(t1.acc > 1){done = false;}select(t2, t1);}}if(done){if(0 == remain){score += 1000;}printf("Final score: %d, with %d balls remaining.\n\n", score, remain);break;}else{remain -= t2.acc;const int cal_score = (t2.acc - 2) * (t2.acc - 2);score += cal_score;printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n", move, t2.bottommost, t2.leftmost, t2.acc, t2.colour, cal_score);compress(t2.block_num, block, visited);}}}return 0;}