The Same Game(模拟)
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(模拟)的更多相关文章
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- HTML 事件(四) 模拟事件操作
本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4. ...
- 模拟AngularJS之依赖注入
一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...
- webapp应用--模拟电子书翻页效果
前言: 现在移动互联网发展火热,手机上网的用户越来越多,甚至大有超过pc访问的趋势.所以,用web程序做出仿原生效果的移动应用,也变得越来越流行了.这种程序也就是我们常说的单页应用程序,它也有一个英文 ...
- javascript动画系列第一篇——模拟拖拽
× 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ...
- C++ 事件驱动型银行排队模拟
最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...
- MSYS2——Windows平台下模拟linux环境的搭建
最近从MSYS1.0迁移到了MSYS2.0,简单讲,MSYS2.0功能更强大,其环境模拟更加符合linux.虽然本身来自cygwin,但其集成了pacman软件管理工具,很有linux范,并且可以直接 ...
- trigger事件模拟
事件模拟trigger 在操作DOM元素中,大多数事件都是用户必须操作才会触发事件,但有时,需要模拟用户的操作,来达到效果. 需求:页面初始化时触发搜索事件并获取input控件值,并打印输出(效果图如 ...
随机推荐
- iOS NavigaitonController详解(code版)
参考文章:http://blog.csdn.net/totogo2010/article/details/7681879,参考了这篇文章,写的超级好,自己他的基础上加上了自己的理解. 下面的图显示了导 ...
- rabbitmq 消息持久化
rabbitmq 消息持久化 2016-02-18 11:19 224人阅读 评论(0) 收藏 举报 分类: 综合(15) 版权声明:本文为博主原创文章,未经博主允许不得转载. 二: 任务分发 & ...
- AS插件开发 RemoveButterKnife从构思到实现
ReomveButterKnife插件 这是一个用于移除代码中对ButterKnife使用的AS插件,接下来我们将从头开始讲讲这个插件的开发过程 地址是 https://github.com/u3sh ...
- 自己写的demo。List<HashMap<String,Object>>=new ArrayList<HashMap<String,Object>>
package com.pb.collection; import java.util.ArrayList; import java.util.HashMap; import java.util.It ...
- VS2010在WIN7 64位系统下架设网站及路由器配置
步骤一:安装IIS 打开[控制面板]-[程序和功能],在左侧进入[打开或关闭windows功能],按照下图选择Internet信息项目下的子选项并安装: 步骤二:配置应用程序池 打开[控制面板]-[管 ...
- 拦截器getmodel方法什么时候被调用(没搞懂有什么鸟用,自己搭的项目中用到了这个)
拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制.Struts2 的预定义拦截器 modelDriven 如果action实 ...
- SQL Server Management Studio的对象资源管理器的使用
1.查看 2.对象资源管理器 3.点到某个表的身上 4.出现以下图片,因为有时动态创建的触发器,刷新表下面的触发器可能不出来,所以来这里面找
- if elsif;报错;new赋值
1. IF INSERTING THEN BEGIN 中间不能为空 END;ELSIF DELETING THEN BEGIN E ...
- CentOS 7重装mysql编译过程报错解决方法
错误记录: [ 82%] Building C object libmysql/CMakeFiles/clientlib.dir/__/sql-common/client.c.o/usr/local/ ...
- 【ZOJ2112】【整体二分+树状数组】带修改区间第k大
The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...