zoukankan      html  css  js  c++  java
  • POJ1027 The Same Game

    题目来源:http://poj.org/problem?id=1027

    题目大意:

      题目说的就是现在蛮流行的手机小游戏popstar,求用贪心方法能得到多少分。

      小球有三种颜色:R/G/B。横向、纵向相连的同色小球可以同时被消掉。消掉一些小球后,首先空格上面的小球会下落,填补空白,然后如果中间出现空的列,则空列右侧的小球左移,填补空列。

      当m个球被消掉时,奖分(m-2)^2,若所有球都被消掉,奖分1000.贪心策略是每次选择消去连在一起数目最多的球。当有多个时,找最左最下的球所在的那一群。

    输入:第一行为测试用例数。每个用例由一系列字符串组成,表示初始时小球的分布。

    输出:每步选择的小球,每步消掉的小球数,得到的分数,以及最后的得分和剩余小球数。

    具体形式见Sample


    Sample Input

    3 
    RGGBBGGRBRRGGBG 
    RBGRBGRBGRBGRBG
    RRRRGBBBRGGRBBB
    GGRGBGGBRRGGGBG
    GBGGRRRRRBGGRRR
    BBBBBBBBBBBBBBB
    BBBBBBBBBBBBBBB
    RRRRRRRRRRRRRRR
    RRRRRRGGGGRRRRR
    GGGGGGGGGGGGGGG
    
    RRRRRRRRRRRRRRR
    RRRRRRRRRRRRRRR
    GGGGGGGGGGGGGGG
    GGGGGGGGGGGGGGG
    BBBBBBBBBBBBBBB
    BBBBBBBBBBBBBBB
    RRRRRRRRRRRRRRR
    RRRRRRRRRRRRRRR 
    GGGGGGGGGGGGGGG
    GGGGGGGGGGGGGGG
    
    RBGRBGRBGRBGRBG
    BGRBGRBGRBGRBGR
    GRBGRBGRBGRBGRB
    RBGRBGRBGRBGRBG
    BGRBGRBGRBGRBGR
    GRBGRBGRBGRBGRB
    RBGRBGRBGRBGRBG
    BGRBGRBGRBGRBGR
    GRBGRBGRBGRBGRB
    RBGRBGRBGRBGRBG

    Sample Output

    Game 1: 
    
    Move 1 at (4,1): removed 32 balls of color B, got 900 points. 
    Move 2 at (2,1): removed 39 balls of color R, got 1369 points. 
    Move 3 at (1,1): removed 37 balls of color G, got 1225 points. 
    Move 4 at (3,4): removed 11 balls of color B, got 81 points. 
    Move 5 at (1,1): removed 8 balls of color R, got 36 points. 
    Move 6 at (2,1): removed 6 balls of color G, got 16 points. 
    Move 7 at (1,6): removed 6 balls of color B, got 16 points. 
    Move 8 at (1,2): removed 5 balls of color R, got 9 points. 
    Move 9 at (1,2): removed 5 balls of color G, got 9 points. 
    Final score: 3661, with 1 balls remaining. 
    
    Game 2: 
    
    Move 1 at (1,1): removed 30 balls of color G, got 784 points. 
    Move 2 at (1,1): removed 30 balls of color R, got 784 points. 
    Move 3 at (1,1): removed 30 balls of color B, got 784 points. 
    Move 4 at (1,1): removed 30 balls of color G, got 784 points. 
    Move 5 at (1,1): removed 30 balls of color R, got 784 points. 
    Final score: 4920, with 0 balls remaining. 
    
    Game 3: 
    
    Final score: 0, with 150 balls remaining.

    按照给定的策略模拟游戏的进行即可,只是调试比较需要耐心和细心。

      1 //////////////////////////////////////////////////////////////////////////
      2 //        POJ1027 The Same Game
      3 //        Memory: 288K        Time: 500MS
      4 //        Language: C++        Result: Accepted
      5 //////////////////////////////////////////////////////////////////////////
      6 
      7 #include <iostream>
      8 #include <stdio.h>
      9 
     10 using namespace std;
     11 
     12 int gameCnt;
     13 char board[11][16];
     14 int record[11][16];
     15 int rows[15];
     16 int maxRow = 0;
     17 int maxCol = 0;
     18 char color = ' ';
     19 int maxCluster = 0;
     20 int score;
     21 
     22 int bfs(int row, int col) {
     23     if (board[row][col] == 0) {
     24         return 0;
     25     }
     26     color = board[row][col];
     27     int cluster = 1;
     28     record[row][col] = 1;
     29     if (board[row + 1][col] != 0 && record[row + 1][col] == 0 && board[row + 1][col] == color) {
     30         cluster += bfs(row + 1, col);
     31     }
     32     if (board[row - 1][col] != 0 && record[row - 1][col] == 0 && board[row - 1][col] == color) {
     33         cluster += bfs(row - 1, col);
     34     }
     35     if (board[row][col + 1] != 0 && record[row][col + 1] == 0 && board[row][col + 1] == color) {
     36         cluster += bfs(row, col + 1);
     37     }
     38     if (board[row][col - 1] != 0 && record[row][col - 1] == 0 && board[row][col - 1] == color) {
     39         cluster += bfs(row, col - 1);
     40     }
     41     return cluster;
     42 }
     43 
     44 void clear(int row, int col) {
     45     board[row][col] = 0;
     46     if (board[row + 1][col] != 0 && board[row + 1][col] == color) {
     47         clear(row + 1, col);
     48     }
     49     if (board[row - 1][col] != 0 && board[row - 1][col] == color) {
     50         clear(row - 1, col);
     51     }
     52     if (board[row][col + 1] != 0 && board[row][col + 1] == color) {
     53         clear(row, col + 1);
     54     }
     55     if (board[row][col - 1] != 0 && board[row][col - 1] == color) {
     56         clear(row, col - 1);
     57     }
     58 }
     59 
     60 void process(int row, int col) {
     61     clear(row, col);
     62     int r = 0, c = 0;
     63     for (c = 0; c < 15; ++c) {
     64         int i, j;
     65         for (i = 0; i < 10 && board[i][c] != 0; ++i) {
     66             continue;
     67         }
     68         for (j = i; j < 10 && board[j][c] == 0; ++j) {
     69             continue;
     70         }
     71         while (i < 10) {
     72             if (j > 10) {
     73                 board[i++][c] = 0;
     74                 continue;
     75             }
     76             if (board[j][c] == 0) {
     77                 ++j;
     78                 continue;
     79             }
     80             board[i++][c] = board[j++][c];
     81         }
     82     }
     83     int i = 0, j = 0;
     84     for (i = 0; i < 15 && board[0][i] != 0; ++i) {
     85         continue;
     86     }
     87     for (j = i; j < 15 && board[0][j] == 0; ++j) {
     88         continue;
     89     }
     90     while (i < 15) {
     91         if (j > 15) {
     92             for (int k = 0; k <= 10; ++k) {
     93                 board[k][i] = 0;
     94             }
     95             ++i;
     96             continue;
     97         }
     98         if (board[0][j] == 0) {
     99             ++j;
    100             continue;
    101         }
    102         for (int k = 0; k <= 10; ++k) {
    103             board[k][i] = board[k][j];
    104         }
    105         ++i;
    106         ++j;
    107     }
    108 }
    109 
    110 int main() {
    111 
    112     cin >> gameCnt;
    113     for (int gameId = 1; gameId <= gameCnt; ++gameId) {
    114         int row, col;
    115         memset(record, 0, sizeof(record));
    116         color = ' ';
    117         maxCluster = 0;
    118         for (row = 9; row >= 0; --row) {
    119             for (col = 0; col < 15; ++col) {
    120                 cin >> board[row][col];
    121             }
    122         }
    123         int move = 1;
    124         int score = 0;
    125         int remain = 150;
    126 
    127         cout << "Game " << gameId << ":" << endl << endl;
    128         while (true) {
    129             maxCluster = 0;
    130             memset(record, 0, sizeof(record));
    131             for (row = 0, col = 0; board[row][col] != 0; ++col) {
    132                 for (row = 0; board[row][col] != 0; ++ row) {
    133                     if (record[row][col] != 0) continue;
    134                     int cluster = bfs(row, col);
    135                     if (cluster > maxCluster) {
    136                         maxRow = row;
    137                         maxCol = col;
    138                         maxCluster = cluster;
    139                     }
    140                 }
    141                 row = 0;
    142             }
    143             color = board[maxRow][maxCol];
    144             if (maxCluster < 2) {
    145                 break;
    146             }
    147             int point = (maxCluster - 2) * (maxCluster - 2);
    148             remain -= maxCluster;
    149             cout << "Move "<< move << " at (" << maxRow + 1 << ","<< maxCol + 1 
    150                 << "): removed " << maxCluster <<" balls of color " << color << ", got " 
    151                 << point << " points." << endl;
    152             ++move;
    153             score += point;
    154             process(maxRow, maxCol);
    155         }
    156         if (remain == 0) {
    157             score += 1000;
    158         }
    159         cout << "Final score: " << score << ", with " << remain << " balls remaining." << endl << endl;
    160     }
    161 
    162     system("pause");
    163     return 0;
    164 }
    View Code
  • 相关阅读:
    [置顶] win7 && win8 下安装SqlServer 2008出现错误无法将对象实例化的问题
    [置顶] sizeof()和c++中变量们
    [置顶] sql2008 附加数据库 .mdf 出现错误 解决方案
    [置顶] 漂亮的 tab 样式
    [置顶] 认识指针和指针变量
    [置顶] SqlHelper类
    [置顶] 第一次使用事物 利用线性表
    [置顶] 设计模式之单例模式 (Design patterns of the The singleton pattern)c#
    [置顶] ListBox控件的数据绑定
    RedHat 6.0(64位)如何使用CentOS YUM源更新的方法
  • 原文地址:https://www.cnblogs.com/dengeven/p/3228977.html
Copyright © 2011-2022 走看看