The Same Game


Time Limit: 1000MS Memory Limit: 10000K

Description

The game named “Same” is a single person game played on a 10 \Theta 15 board. Each square contains a ball colored red (R), green (G), or blue (B). Two balls belong to the same cluster if they have the same color, and one can be reached from another by following balls of the same color in the four directions up, down, left, and right. At each step of the game, the player chooses a ball whose cluster has at least two balls and removes all balls in the cluster from the board. Then, the board is “compressed” in two steps:

1. Shift the remaining balls in each column down to fill the empty spaces. The order of the balls in each column is preserved.

2. If a column becomes empty, shift the remaining columns to the left as far as possible. The order of the columns is preserved.

For example, choosing the ball at the bottom left corner in the sub-board below causes:



The objective of the game is to remove every ball from the board, and the game is over when every ball is removed or when every cluster has only one ball. The scoring of each game is as follows. The player starts with a score of 0. When a cluster of m balls is removed, the player’s score increases by (m-2)^2 . A bonus of 1000 is given if every ball is removed at the end of the game.

You suspect that a good strategy might be to choose the ball that gives the largest possible cluster at each step, and you want to test this strategy by writing a program to simulate games played using this strategy. If there are two or more balls to choose from, the program should choose the leftmost ball giving the largest cluster. If there is still a tie, it should choose the bottommost ball of these leftmost balls.

Input

You will be given a number of games in the input. The first line of input contains a positive integer giving the number of games to follow. The initial arrangement of the balls of each game is given one row at a time, from top to bottom. Each row contains 15 characters, each of which is one of “R”, “G”, or “B”, specifying the colors of the balls in the row from left to right. A blank line precedes each game.

Output

For each game, print the game number, followed by a new line, followed by information about each move, followed by the final score. Each move should be printed in the format:

Move x at (r,c): removed b balls of color C, got s points.

where x is the move number, r and c are the row number and column number of the chosen ball, respectively. The rows are numbered from 1 to 10 from the bottom, and columns are numbered from 1 to 15 from the left. b is the number of balls in the cluster removed. C is one of “R”, “G”, or “B”, indicating the color of the balls removed. s is the score for this move. The score does not include the 1000 point bonus if all the balls are removed after the move.

The final score should be reported as follows:

Final score: s, with b balls remaining.

Insert a blank line between the output of each game. Use the plural forms “balls” and “points” even if the corresponding value is 1.

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.

Source

East Central North America 1999

题意:在一个固定大小为10x15的矩形区域A内被RGB三种颜色的小球填满。

现在按如下步骤操作:

1. 删除区域A内最大的一片区域M(任意颜色都可以,只要其占有区域最大)

2. 删除M后,自然会出现空的位置,在M区域上方的小球自然下落;

当删除M后出现空列时,右边的列往左填充。

注意是以“列”为单位填充,非空列只能整列往空列移动。

移动后,各个小球之间的相对顺序 与 移动前一样。

3. 当区域A剩余小球数为0,或A内的最大区域为1时,游戏结束。否则返回1。

输出每一步的得分,最后输出总得分。**

简单的模拟,没有什么坑点

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
const int n = 10;
const int m = 15;
char str[15][20];
int X,Y,num,sorce,t;
int dir[][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool vis[15][20];
bool Judge(int Fx,int Fy,char s)
{
if(Fx>=0&&Fx<n&&Fy>=0&&Fy<m&&str[Fx][Fy]==s)
{
return true;
}
return false;
}
int dfs(int x,int y,char s)
{
vis[x][y] = true;
int ans= 1 ;
for(int i=0;i<4;i++)
{
int Fx = x+dir[i][0];
int Fy = y+dir[i][1];
if(Judge(Fx,Fy,s)&&!vis[Fx][Fy])
{
ans += dfs(Fx,Fy,s);
}
}
return ans;
}
bool BFS()
{
memset(vis,false,sizeof(vis));
int Max= 0,ans;
for(int j=0;j<15;j++)
{
for(int i=0;i<10;i++)
{
if(!vis[i][j]&&str[i][j]!=0)
{
ans = dfs(i,j,str[i][j]);
if(ans>Max)
{
X = i;
Y = j;
Max = ans;
}
}
}
}
if(Max>=2)
{
num+=Max;
sorce+=(Max-2)*(Max-2);
printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points. \n",t++,X+1,Y+1,Max,str[X][Y],(Max-2)*(Max-2));
}
return Max>=2;
}
void DFS(int x,int y,char s)
{
str[x][y] = 0;
for(int i=0;i<4;i++)
{
int Fx = x + dir[i][0];
int Fy = y + dir[i][1];
if(Judge(Fx,Fy,s))
{
DFS(Fx,Fy,s);
}
}
}
void Union()
{
char s[15][20];
bool visy[20];
memset(visy,false,sizeof(visy));
memset(s,0,sizeof(s));
for(int i=0;i<m;i++)
{
int M = 0;
for(int j=0;j<n;j++)
{
if(str[j][i]!=0)
{
s[M++][i]=str[j][i];
}
}
if(M==0)
{
visy[i]=true;
}
}
memset(str,0,sizeof(str));
int M = 0;
for(int i=0;i<m;i++)
{
if(!visy[i])
{
for(int j=0;j<n;j++)
{
str[j][M]=s[j][i];
}
M++;
}
}
}
int main()
{
int T;
int z = 1;
scanf("%d",&T);
while(T--)
{
for(int i=9;i>=0;i--)
{
scanf("%s",str[i]);
}
if(z!=1)
{
printf("\n");
}
printf("Game %d:\n\n",z++);
t=1,num = 0,sorce = 0;
while(BFS())
{
DFS(X,Y,str[X][Y]);
Union();
}
if(num == 150)
{
sorce+=1000;
}
printf("Final score: %d, with %d balls remaining. \n",sorce,150-num);
}
return 0;
}

The Same Game-POJ1027模拟的更多相关文章

  1. POJ1027 The Same Game

    题目来源:http://poj.org/problem?id=1027 题目大意: 题目说的就是现在蛮流行的手机小游戏popstar,求用贪心方法能得到多少分. 小球有三种颜色:R/G/B.横向.纵向 ...

  2. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  3. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  4. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  5. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

  6. 模拟AngularJS之依赖注入

    一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...

  7. webapp应用--模拟电子书翻页效果

    前言: 现在移动互联网发展火热,手机上网的用户越来越多,甚至大有超过pc访问的趋势.所以,用web程序做出仿原生效果的移动应用,也变得越来越流行了.这种程序也就是我们常说的单页应用程序,它也有一个英文 ...

  8. javascript动画系列第一篇——模拟拖拽

    × 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ...

  9. C++ 事件驱动型银行排队模拟

    最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...

  10. MSYS2——Windows平台下模拟linux环境的搭建

    最近从MSYS1.0迁移到了MSYS2.0,简单讲,MSYS2.0功能更强大,其环境模拟更加符合linux.虽然本身来自cygwin,但其集成了pacman软件管理工具,很有linux范,并且可以直接 ...

随机推荐

  1. JavaScript中一些常用的方法整理

    当前时间和输入时间比较 var timeLong = Date.parse(new Date());//当前时间var t1 = Date.parse($("#returnTime2&quo ...

  2. magento后台paypal设置

    如何在magento后台设置paypal呢? 这边把整理的简单跟大家分享一下. 1.system->config-paypel1.1 Merchant Country 设置国家1.2 Email ...

  3. JMeter学习-039-JMeter 3.0 生成 dashboard HTML 报告图表中文乱码

    近期,经常有人问 JMeter 3.0 使用时,生成的 HTML 报告图表中的中文乱码问题.在此,简略的说一下解决的方法. 编码相关信息如下: 1.查看控制 csv.xml 等配置结果文件生成.读取的 ...

  4. OC ---- 字典集合 iOS学习-----细碎知识点总结

    实例方法的创建 NSDictionary *wukong = [[NSDictionary alloc] initWithObjectsAndKeys:", @"age" ...

  5. 使用udev实现显示器的热插拔和usb的自动挂载

    udev:用来监听硬件设备是否发生改变,并可以给硬件设备命名 ,也可以在硬件发生改变之后执行脚本 使用udev检测显示器是否发生变化,然后执行脚本,解决linux显示器热插拔问题 先补充一点: [ro ...

  6. linux下普通用户如何使用80端口启动程序

    linux下普通用户如何使用80端口启动程序 http://blog.csdn.net/shootyou/article/details/6750230 大家都知道默认情况下linux的1024以下端 ...

  7. Oracle之nclob类型

    此类型会严重影响查询效率,请少用: nclob字段在查询结果中显示为<NCLOB>,查看nclob类型的值方法有两种 a.可点开...查看具体数据 b.选择所有数据,右击复制到Excel, ...

  8. 数据迁移工具sqoop

    有问题........数据迁移工具sqoop sqoop安装 [root@sqoop data]# wget  wget http://apache.fayea.com/sqoop/1.4.6/sqo ...

  9. pip install 安装python-requests

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-requests

  10. TT3

    crm_kfs_fy     房源 dk_sq_cs       申请测算 dk_zh            贷款账户 dk_ht            借款合同 SS_DICT_MX 数据字典明细 ...