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控件值,并打印输出(效果图如 ...
随机推荐
- 在Eclipse中显示空格(space)和制表符(tab)
显示空格(space)和制表符(tab)设置: Window->Preferences->General->Editors->Text Editors->Show whi ...
- java中关于public class
在编写类的时候可以使用两种方式定义类: public class定义类: class定义类: 1,如果一个类声明的时候使用了public class进行了声明,则类名称必须与文件名称完 ...
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)
1. 比较器排序(定制排序) 前面我们说到的TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列. 但是如果需要实现定制排序,比如实现降序排序,则要通过比较器排序(定制排序)实 ...
- 基于Html5的兼容所有主流浏览器的在线视频播放器videoJs
在一个新的项目上需要实现在线视频播放,原本打算借助优酷的视频存储和播放,但是发现这个需要用户注册优酷账户,严重影响用户体验,于是这个方案被毙掉了.于是开始了自己开发一个在线播放器的想法,当然尽量使用已 ...
- centos6.5 64位 openvpn安装配置
1 查看系统版本 2 cat /etc/redhat-release 3 CentOS release 6.5 (Final) 4 5 查看内核和cpu架构 6 uname -rm 7 2.6.32- ...
- Android 5.0以上手机出现找不到so文件
问题描述 最近做项目出了一个bug项目中用到so文件,在5.0以上的手机上会报一个初始化异常错误,并提示找不到so文件.lib里目录结构类似如下 在Android5以下都没有问题,在5.0以上会报错 ...
- Android性能优化之ViewStub
http://www.cnblogs.com/lwbqqyumidi/p/4047108.html ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Andro ...
- windows Server 2008 -必须使用“角色管理工具”安装或配置Microsoft .Net Framework 3.5
在windows Server 2008上安装 .Net Framework 3.5的时候,报错:必须使用“角色管理工具”安装或配置Microsoft .Net Framework 3.5. Solu ...
- c# 为什么要用 get set 属性
1 可以对赋值 做验证 ,范伟限制,额外的限制 2 可以设置 只读 只写 3 可以做线程同步 4 可以将属性设置在interface接口中 5 可以使用虚属性 或 抽象属性 可以填补 没有 虚字段 抽 ...
- 可以打开mdb文件的小软件
下载地址: http://dl-sh-ocn-1.pchome.net/09/rh/DatabaseBrowser.zip