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,手写队列);

  重置地图;

  输出;

}

  1. #include<stdio.h>
  2. #include<string.h>
  3. char map[][];
  4. bool vis[][];
  5. int MaxR,MaxC;//分别存同色最大区域左下角坐标
  6. int Maxsize;//Maxsize存最大面积
  7. char Maxcolor;//最大同色区域的颜色;
  8.  
  9. int Area(int i,int j)//搜索当前同色区域面积
  10. {
  11. struct node
  12. {
  13. int x,y;
  14. }que[];
  15.  
  16. int head,tail;
  17. head = tail = ;
  18.  
  19. que[tail].x = i;
  20. que[tail++].y = j;
  21. vis[i][j] = true;
  22.  
  23. char color = map[i][j];
  24. int size = ;
  25. while(head < tail)
  26. {
  27. int x = que[head].x;
  28. int y = que[head++].y;
  29. size++;
  30.  
  31. if((x+)< && !vis[x+][y] && map[x+][y] == color)
  32. {
  33. que[tail].x = x+;
  34. que[tail++].y = y;
  35. vis[x+][y] = true;
  36. }
  37. if((x-)>= && !vis[x-][y] && map[x-][y] == color)
  38. {
  39. que[tail].x = x-;
  40. que[tail++].y = y;
  41. vis[x-][y] = true;
  42. }
  43. if((y-)>= && !vis[x][y-] && map[x][y-] == color)
  44. {
  45. que[tail].x = x;
  46. que[tail++].y = y-;
  47. vis[x][y-] = true;
  48. }
  49. if((y+)< && !vis[x][y+] && map[x][y+] == color)
  50. {
  51. que[tail].x = x;
  52. que[tail++].y = y+;
  53. vis[x][y+] = true;
  54. }
  55. }
  56. return size;
  57. }
  58.  
  59. void SearchArea()//搜索同色最大区域;
  60. {
  61. int i,j;
  62. memset(vis,false,sizeof(vis));
  63. Maxsize = ;
  64. for(j = ; j < ; j++)
  65. {
  66. for(i = ; i < ; i++)
  67. {
  68. int size = -;
  69. if(!vis[i][j] && map[i][j])
  70. {
  71. size = Area(i,j);
  72. if(size > Maxsize)
  73. {
  74. Maxsize = size;
  75. MaxR = i;
  76. MaxC = j;
  77. Maxcolor = map[MaxR][MaxC];
  78. }
  79. }
  80. }
  81. }
  82. }
  83.  
  84. void DelArea()//删除最大区域
  85. {
  86. struct node
  87. {
  88. int x,y;
  89. }que[];
  90. int head,tail;
  91. head = tail = ;
  92. que[tail].x = MaxR;
  93. que[tail++].y = MaxC;
  94.  
  95. Maxcolor = map[MaxR][MaxC];
  96. map[MaxR][MaxC] = ;
  97.  
  98. while(head < tail)
  99. {
  100. int x = que[head].x;
  101. int y = que[head++].y;
  102. map[x][y] = ;
  103.  
  104. if(x+ < && map[x+][y] == Maxcolor)
  105. {
  106. map[x+][y] = ;
  107. que[tail].x = x+;
  108. que[tail++].y = y;
  109. }
  110. if(x- >= && map[x-][y] == Maxcolor)
  111. {
  112. map[x-][y] = ;
  113. que[tail].x = x-;
  114. que[tail++].y = y;
  115. }
  116. if(y- >= && map[x][y-] == Maxcolor)
  117. {
  118. map[x][y-] = ;
  119. que[tail].x = x;
  120. que[tail++].y = y-;
  121. }
  122. if(y+ < && map[x][y+] == Maxcolor)
  123. {
  124. map[x][y+] = ;
  125. que[tail].x = x;
  126. que[tail++].y = y+;
  127. }
  128. }
  129. }
  130.  
  131. void NewMap()//重置
  132. {
  133. bool empty[] = {false};//记录哪一列是空列
  134. int i,j;
  135. for(j = ; j < ; j++)//重置行
  136. {
  137. int ti = -;//表示第ti行是空的,ti = -1 表示现在没有空行;
  138. bool flag = false;
  139. for(i = ; i < ; i++)
  140. {
  141. if(map[i][j])
  142. {
  143. flag = true;
  144. if(ti != -)
  145. {
  146. map[ti][j] = map[i][j];//将第i行移至第ti行
  147. map[i][j] = ;//将第i行置0;
  148. i = ti;//从ti行开始再一次枚举;
  149. ti = -;
  150. }
  151. }
  152. else
  153. {
  154. ti = i;
  155. while(i+ < && !map[i+][j])
  156. i++;
  157. }
  158. }
  159. if(!flag)
  160. empty[j] = true;
  161. }
  162. int tj = -;//表示第tj列是空的,tj = -1说明现在好没有空列
  163. for(j = ; j < ; j++)//重置列
  164. {
  165. if(!empty[j])//如果第j列是不空的
  166. {
  167. if(tj != -)
  168. {
  169. for(i = ; i < ; i++)
  170. {
  171. map[i][tj] = map[i][j];
  172. map[i][j] = ;
  173. }
  174. empty[j] = true;
  175. j = tj;
  176. tj = -;
  177. }
  178. }
  179. else
  180. {
  181. tj = j;
  182. while(j+< && empty[j+])
  183. j++;
  184. }
  185. }
  186. }
  187.  
  188. int main()
  189. {
  190. int test;
  191. scanf("%d",&test);
  192. for(int item = ; item <= test; item++)
  193. {
  194. for(int i = ; i >= ; i--)
  195. scanf("%s",map[i]);
  196.  
  197. printf("Game %d:\n\n",item);
  198.  
  199. int Balls = ;
  200. int step = ;
  201. int sumscore = ;
  202. while(true)
  203. {
  204. Maxsize = -;
  205. SearchArea();//寻找同色最大区域;
  206. if(Maxsize == || Maxsize == )
  207. break;
  208.  
  209. DelArea();//删除当前最大区域
  210. NewMap();//重置
  211.  
  212. int score = (Maxsize-)*(Maxsize-);
  213. printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",++step,MaxR+,MaxC+,Maxsize,Maxcolor,score);
  214. Balls = Balls - Maxsize;
  215. sumscore += score;
  216. }
  217. if(Balls == )
  218. sumscore += ;
  219. printf("Final score: %d, with %d balls remaining.\n\n",sumscore,Balls);
  220. }
  221. return ;
  222. }

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

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

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

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

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

  3. Python 爬虫模拟登陆知乎

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

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

    本篇主要介绍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++ 事件驱动型银行排队模拟

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

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

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

  10. trigger事件模拟

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

随机推荐

  1. c#中jeson字符串和OBJECT对象的相互转换

    对于本问题   我用三步来分别说明实现过程 1.定义一个类---- 实现转换的具体方法 using System; using System.Collections.Generic; using Sy ...

  2. oracle添加数据时主键自动增长

    CREATE TABLE STUDENT( --创建学生表  ID NUMBER(10) PRIMARY KEY,   --主键ID  SNAME VARCHAR2(20), ); 此时给学生表添加数 ...

  3. SpringSecurity 在MVC 中的简单使用(翻译的,稍加改动)

    Spring Security允许开发人员轻松地将安全功能集成到J2EE Web应用程序中,它通过Servlet过滤器实现“用户自定义”安全检查. 在本教程中,我们将向您展示如何在Spring MVC ...

  4. cocos2dx Hello world 创建

    环境搭建好后,就要开始创建自己的第一个hello world项目了 因为没有安装其他的插件,所以最开始只能手动创建 首先通过cmd 进入你的cocos2dx的路径下: D:\soft\cocos2d- ...

  5. SQL存储过程传入字段名查询.

    根据字段名和对应的值查询. (正确代码):目前发现,需要"分组,排序"等才能解决,如"order by","group by"等. SQL代 ...

  6. C#获取类中所有方法

    var t = typeof(HomeController); //获取所有方法 System.Reflection.MethodInfo[] methods = t.GetMethods(); // ...

  7. VMware复制Centos6虚拟机要改的地方

    1.删除文件 /etc/udev/rules.d/70-persistent-net.rules  (它会绑定你网卡信息) 2.重新配置 # vi /etc/sysconfig/network-scr ...

  8. WINDOWS批处理命令使用大全

    来源:http://www.942dn.com就是爱电脑网 WINDOWS批处理命令使用大全 批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母.它的构成没有固定格式, ...

  9. VS2010 Cstring to int

    今天遇到一个将Cstring转化为int的问题,用atoi(),发现不可以,找了一下原因. 原来因为在VS2015(2010)的版本中是UNICODE ,请使用这个函数 _ttoi() . CStri ...

  10. CentOS6.5升级为CentOS7.0

    CentOS6.5升级为CentOS7.0 CentOS6.5升级为CentOS7 升级前: [root@localhost ~]# cat /proc/version  Linux version ...