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控件值,并打印输出(效果图如 ...
随机推荐
- c#中jeson字符串和OBJECT对象的相互转换
对于本问题 我用三步来分别说明实现过程 1.定义一个类---- 实现转换的具体方法 using System; using System.Collections.Generic; using Sy ...
- oracle添加数据时主键自动增长
CREATE TABLE STUDENT( --创建学生表 ID NUMBER(10) PRIMARY KEY, --主键ID SNAME VARCHAR2(20), ); 此时给学生表添加数 ...
- SpringSecurity 在MVC 中的简单使用(翻译的,稍加改动)
Spring Security允许开发人员轻松地将安全功能集成到J2EE Web应用程序中,它通过Servlet过滤器实现“用户自定义”安全检查. 在本教程中,我们将向您展示如何在Spring MVC ...
- cocos2dx Hello world 创建
环境搭建好后,就要开始创建自己的第一个hello world项目了 因为没有安装其他的插件,所以最开始只能手动创建 首先通过cmd 进入你的cocos2dx的路径下: D:\soft\cocos2d- ...
- SQL存储过程传入字段名查询.
根据字段名和对应的值查询. (正确代码):目前发现,需要"分组,排序"等才能解决,如"order by","group by"等. SQL代 ...
- C#获取类中所有方法
var t = typeof(HomeController); //获取所有方法 System.Reflection.MethodInfo[] methods = t.GetMethods(); // ...
- VMware复制Centos6虚拟机要改的地方
1.删除文件 /etc/udev/rules.d/70-persistent-net.rules (它会绑定你网卡信息) 2.重新配置 # vi /etc/sysconfig/network-scr ...
- WINDOWS批处理命令使用大全
来源:http://www.942dn.com就是爱电脑网 WINDOWS批处理命令使用大全 批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母.它的构成没有固定格式, ...
- VS2010 Cstring to int
今天遇到一个将Cstring转化为int的问题,用atoi(),发现不可以,找了一下原因. 原来因为在VS2015(2010)的版本中是UNICODE ,请使用这个函数 _ttoi() . CStri ...
- CentOS6.5升级为CentOS7.0
CentOS6.5升级为CentOS7.0 CentOS6.5升级为CentOS7 升级前: [root@localhost ~]# cat /proc/version Linux version ...