The Same Game(模拟)

时间:2022-09-29 18:30:01

http://poj.org/problem?id=1027

题意:给一个10*15的地图,里面填充R,G,B三种颜色,每次找到当前地图的同色最大区域M,并将其删除,删除M后,上面的小球自然下落,当有空列时,空列右边的小球同时向左移动一列,

当最后地图上同色最大区域的小球个数是1或0时,循环结束;注意输出格式,最后输出一个空行。

思路:

while(true)

{

  找到同色最大区域,包括其面积Maxsize,坐标,颜色(BFS,手写队列);

  if (Maxsize == 1 || Maxsize == 0) break;

  删除该最大区域,即将map[i][j] 置为0,(BFS,手写队列);

  重置地图;

  输出;

}

 #include<stdio.h>
#include<string.h>
char map[][];
bool vis[][];
int MaxR,MaxC;//分别存同色最大区域左下角坐标
int Maxsize;//Maxsize存最大面积
char Maxcolor;//最大同色区域的颜色; int Area(int i,int j)//搜索当前同色区域面积
{
struct node
{
int x,y;
}que[]; int head,tail;
head = tail = ; que[tail].x = i;
que[tail++].y = j;
vis[i][j] = true; char color = map[i][j];
int size = ;
while(head < tail)
{
int x = que[head].x;
int y = que[head++].y;
size++; if((x+)< && !vis[x+][y] && map[x+][y] == color)
{
que[tail].x = x+;
que[tail++].y = y;
vis[x+][y] = true;
}
if((x-)>= && !vis[x-][y] && map[x-][y] == color)
{
que[tail].x = x-;
que[tail++].y = y;
vis[x-][y] = true;
}
if((y-)>= && !vis[x][y-] && map[x][y-] == color)
{
que[tail].x = x;
que[tail++].y = y-;
vis[x][y-] = true;
}
if((y+)< && !vis[x][y+] && map[x][y+] == color)
{
que[tail].x = x;
que[tail++].y = y+;
vis[x][y+] = true;
}
}
return size;
} void SearchArea()//搜索同色最大区域;
{
int i,j;
memset(vis,false,sizeof(vis));
Maxsize = ;
for(j = ; j < ; j++)
{
for(i = ; i < ; i++)
{
int size = -;
if(!vis[i][j] && map[i][j])
{
size = Area(i,j);
if(size > Maxsize)
{
Maxsize = size;
MaxR = i;
MaxC = j;
Maxcolor = map[MaxR][MaxC];
}
}
}
}
} void DelArea()//删除最大区域
{
struct node
{
int x,y;
}que[];
int head,tail;
head = tail = ;
que[tail].x = MaxR;
que[tail++].y = MaxC; Maxcolor = map[MaxR][MaxC];
map[MaxR][MaxC] = ; while(head < tail)
{
int x = que[head].x;
int y = que[head++].y;
map[x][y] = ; if(x+ < && map[x+][y] == Maxcolor)
{
map[x+][y] = ;
que[tail].x = x+;
que[tail++].y = y;
}
if(x- >= && map[x-][y] == Maxcolor)
{
map[x-][y] = ;
que[tail].x = x-;
que[tail++].y = y;
}
if(y- >= && map[x][y-] == Maxcolor)
{
map[x][y-] = ;
que[tail].x = x;
que[tail++].y = y-;
}
if(y+ < && map[x][y+] == Maxcolor)
{
map[x][y+] = ;
que[tail].x = x;
que[tail++].y = y+;
}
}
} void NewMap()//重置
{
bool empty[] = {false};//记录哪一列是空列
int i,j;
for(j = ; j < ; j++)//重置行
{
int ti = -;//表示第ti行是空的,ti = -1 表示现在没有空行;
bool flag = false;
for(i = ; i < ; i++)
{
if(map[i][j])
{
flag = true;
if(ti != -)
{
map[ti][j] = map[i][j];//将第i行移至第ti行
map[i][j] = ;//将第i行置0;
i = ti;//从ti行开始再一次枚举;
ti = -;
}
}
else
{
ti = i;
while(i+ < && !map[i+][j])
i++;
}
}
if(!flag)
empty[j] = true;
}
int tj = -;//表示第tj列是空的,tj = -1说明现在好没有空列
for(j = ; j < ; j++)//重置列
{
if(!empty[j])//如果第j列是不空的
{
if(tj != -)
{
for(i = ; i < ; i++)
{
map[i][tj] = map[i][j];
map[i][j] = ;
}
empty[j] = true;
j = tj;
tj = -;
}
}
else
{
tj = j;
while(j+< && empty[j+])
j++;
}
}
} int main()
{
int test;
scanf("%d",&test);
for(int item = ; item <= test; item++)
{
for(int i = ; i >= ; i--)
scanf("%s",map[i]); printf("Game %d:\n\n",item); int Balls = ;
int step = ;
int sumscore = ;
while(true)
{
Maxsize = -;
SearchArea();//寻找同色最大区域;
if(Maxsize == || Maxsize == )
break; DelArea();//删除当前最大区域
NewMap();//重置 int score = (Maxsize-)*(Maxsize-);
printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",++step,MaxR+,MaxC+,Maxsize,Maxcolor,score);
Balls = Balls - Maxsize;
sumscore += score;
}
if(Balls == )
sumscore += ;
printf("Final score: %d, with %d balls remaining.\n\n",sumscore,Balls);
}
return ;
}

The Same Game(模拟)的更多相关文章

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

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

  2. 故障重现&comma; JAVA进程内存不够时突然挂掉模拟

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

  3. Python 爬虫模拟登陆知乎

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

  4. HTML 事件&lpar;四&rpar; 模拟事件操作

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

  5. 模拟AngularJS之依赖注入

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

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

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

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

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

  8. C&plus;&plus; 事件驱动型银行排队模拟

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

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

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

  10. trigger事件模拟

    事件模拟trigger 在操作DOM元素中,大多数事件都是用户必须操作才会触发事件,但有时,需要模拟用户的操作,来达到效果. 需求:页面初始化时触发搜索事件并获取input控件值,并打印输出(效果图如 ...

随机推荐

  1. Nagios监控平台搭建

    Nagios是一款开源的免费网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员, ...

  2. 敏捷开发之Scrum扫盲篇

    现在敏捷开发是越来越火了,人人都在谈敏捷,人人都在学习Scrum和XP... 为了不落后他人,于是我也开始学习Scrum,今天主要是对我最近阅读的相关资料,根据自己的理解,用自己的话来讲述Scrum中 ...

  3. Missing artifact com&period;oracle&colon;ojdbc14&colon;jar&colon;10&period;2&period;0&period;4&period;0

    下载jar,导入到maven中cmd中输入:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=1 ...

  4. NewQuant的设计(二)——MatrixComputation的领域分析

    NewQuant的设计——MatrixComputation的领域分析 MatrixComputation是NewQuant中最重要也是最大的一个模块,这个模块的领域分析要从回答几个问题开始. 一.矩 ...

  5. background-size对background-position的影响

    CSS3中提出了background-size属性,该属性可以设置背景图片的大小,该属性的值设置为绝对数值或者百分比时对background-position没有任何影响,当设置为contain/co ...

  6. RocketMQ消费者示例程序

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本博客实现了一个简单的RocketMQ消费者的示例,MQ里存储的是经过Avro序列化的消息数据,程序读取数据并反序列化后, ...

  7. SVN中的常见错误&lpar;长期更新&rpar;

    一 svn中的简写含义. A:add,新增 C:conflict,冲突 D:delete,删除 M:modify,本地已经修改 G:modify and merGed,本地文件修改并且和服务器的进行合 ...

  8. HW--漂亮度

    描述 给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和.每个字母都有一个“漂亮度”,范围在1到26之间.没有任何两个字母拥有相同的“漂亮度”.字母忽略大小 ...

  9. secureCRT使用退格键(backspace)出现&Hat;H解决的方法

    刚新装了python-3.4.1,使用secureCRT连接上去,可是我在进入后,输入回格键时,屏幕显示的是^H,这个让人受不了.最终在网上找到了解决的方法,仅仅要改动一下secureCRT的配置就可 ...

  10. 【Python】 发邮件用 smtplib &amp&semi; email

    smtplib & email ■ 概述 发邮件主要用到smtplib以及email模块.stmplib用于邮箱和服务器间的连接,发送的步骤.email模块主要用于处理编码,邮件内容等等.主要 ...