方块消除游戏(完美世界2017秋招真题)题目描述

如下图,有10*10个不同颜色的方块,每个方块可能是红、绿、蓝、黄、紫5种颜色之一。当点击其中某一个方块时,如果它有相邻的同颜色方块,则将所有与此方块连续同颜色相邻的方块消除;剩下的方块中,如果下方有空位则向下移动,如果左侧整列都为空位则向左移动。
输入

输入数据有多组,每组占一行,包括一个或多个正整数,取值范围为1~100。每个数代表一次点击,数值为点击的方块编号。

上图中的方块初始值定义已为你写好,可以直接粘贴使用:

const int RED = 0, GREEN = 1, BLUE = 2, YELLOW = 3, PURPLE = 4;

int p[10][10] = {

{RED,RED,BLUE,BLUE,GREEN,YELLOW,BLUE,YELLOW,RED,PURPLE},

{GREEN,GREEN,GREEN,BLUE,RED,PURPLE,RED,YELLOW,YELLOW,BLUE},

{BLUE,RED,RED,YELLOW,YELLOW,PURPLE,BLUE,GREEN,GREEN,BLUE},

{YELLOW,RED,BLUE,YELLOW,BLUE,RED,PURPLE,GREEN,GREEN,RED},

{YELLOW,RED,BLUE,BLUE,PURPLE,GREEN,PURPLE,RED,YELLOW,BLUE},

{PURPLE,YELLOW,RED,RED,YELLOW,RED,PURPLE,YELLOW,RED,RED},

{YELLOW,YELLOW,GREEN,PURPLE,GREEN,RED,BLUE,YELLOW,BLUE,GREEN},

{RED,YELLOW,BLUE,BLUE,YELLOW,GREEN,PURPLE,RED,BLUE,GREEN},

{GREEN,GREEN,YELLOW,YELLOW,RED,RED,PURPLE,BLUE,BLUE,GREEN},

{PURPLE,BLUE,RED,RED,PURPLE,YELLOW,BLUE,RED,RED,GREEN}};

样例输入

6

6 1

输出

对于每个测试实例,要求输出连续各次点击全部完成之后,红、绿、蓝、黄、紫色方块的数量; 每个测试实例的输出占一行。

样例输出

26 18 22 21 13

24 18 22 21 13

时间限制C/C++语言:1000MS其它语言:3000MS
内存限制C/C++语言:65536KB其它语言:589824KB

解:搜索,把点了的标记下来,然后移除。

import java.util.ArrayList;
import java.util.Scanner;/*** * 作者:张宇翔 创建日期:2017年7月27日 上午11:35:04 描述:*/
public class Main {private static final int Max = (int) (10);private static int FLAG = -1;private static String s;private static int[] a;private static int len;private static final int RED = 0, GREEN = 1, BLUE = 2, YELLOW = 3, PURPLE = 4;private static ArrayList<ArrayList<Integer>> list;private static int p[][] = { { RED, RED, BLUE, BLUE, GREEN, YELLOW, BLUE, YELLOW, RED, PURPLE },{ GREEN, GREEN, GREEN, BLUE, RED, PURPLE, RED, YELLOW, YELLOW, BLUE },{ BLUE, RED, RED, YELLOW, YELLOW, PURPLE, BLUE, GREEN, GREEN, BLUE },{ YELLOW, RED, BLUE, YELLOW, BLUE, RED, PURPLE, GREEN, GREEN, RED },{ YELLOW, RED, BLUE, BLUE, PURPLE, GREEN, PURPLE, RED, YELLOW, BLUE },{ PURPLE, YELLOW, RED, RED, YELLOW, RED, PURPLE, YELLOW, RED, RED },{ YELLOW, YELLOW, GREEN, PURPLE, GREEN, RED, BLUE, YELLOW, BLUE, GREEN },{ RED, YELLOW, BLUE, BLUE, YELLOW, GREEN, PURPLE, RED, BLUE, GREEN },{ GREEN, GREEN, YELLOW, YELLOW, RED, RED, PURPLE, BLUE, BLUE, GREEN },{ PURPLE, BLUE, RED, RED, PURPLE, YELLOW, BLUE, RED, RED, GREEN } };private static int[][] dir = new int[][] { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };public static void main(String[] args) {InitData();}private static void InitData() {Scanner cin = new Scanner(System.in);s = new String();while (cin.hasNext()) {s = cin.nextLine();String[] ans = s.split(" ");len = ans.length;a = new int[len];// 每行输入的数for (int i = 0; i < len; i++) {a[i] = Integer.parseInt(ans[i]);}list=new ArrayList<>();for(int i=0;i<Max;i++){list.add(new ArrayList<Integer>(10));}for(int i=0;i<Max;i++){for(int j=0;j<Max;j++){list.get(i).add(p[9-j][i]);}}GetAns();}};private static void GetAns() {for (int i = 0; i < len; i++) {int x=(a[i]-1)%10;int y=9-(a[i]-1)/10;if(x>=list.size()||y>=list.get(x).size()){continue;}boolean ok=false;for(int j=0;j<4;j++){int newx=x+dir[j][0];int newy=y+dir[j][1];if(Check(newx, newy)&&list.get(newx).get(newy)==list.get(x).get(y)){ok=true;break;}}//如果ok=true,说明有星星可以消除if(!ok){continue;}dfs( x, y, list.get(x).get(y));for(int j=0;j<list.size();j++){list.get(j).removeIf(s->s==FLAG);}list.removeIf(s->s.isEmpty()==true);}int k[]=new int[5];for(int i=0;i<list.size();i++){for(int j=0;j<list.get(i).size();j++){k[list.get(i).get(j)]++;}}for(int i=0;i<5;i++){if(i==0){System.out.print(k[i]);}else{System.out.print(" "+k[i]);}}System.out.println();};// 检查是否合法private static boolean Check(int x, int y) {if (x >= 0 && x < list.size() && y >= 0 && y < list.get(x).size())return true;return false;}//搜索,标记private static void dfs(int x,int y,int color) {list.get(x).set(y, FLAG);for(int i=0;i<4;i++){int newx=x+dir[i][0];int newy=y+dir[i][1];if(Check(newx, newy)&&list.get(newx).get(newy)==color){dfs(newx, newy, color);}}}
}

方块消除游戏(完美世界2017秋招真题)相关推荐

  1. 电话号码分身(小米2017秋招真题)

    电话号码分身(小米2017秋招真题) 题目描述 继MIUI8推出手机分身功能之后,MIUI9计划推出一个电话号码分身的功能:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替(&quo ...

  2. 头条校招(今日头条2017秋招真题)

    题目描述 头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队.每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来.在选题之前,我们对题目进行了盲审,并定出 ...

  3. 头条校招(今日头条2017秋招真题)1——python解法

    题目描述 头条的2017校招开始了!为了这次校招,我们组织了一个规模宏大的出题团队.每个出题人都出了一些有趣的题目,而我们现在想把这些题目组合成若干场考试出来.在选题之前,我们对题目进行了盲审,并定出 ...

  4. java号码分身_[算法] 电话号码分身 (小米2017 秋招真题)[JavaScript]

    题目描述 继MIUI8推出手机分身功能,MIUI计划推出一个电话号码分身得功能:首先将电话号码中的每个数字加上8取个位,然后使用对应得大写字母代替 ("ZERO", "O ...

  5. 树的高度(小米2017秋招真题)

    现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度. 输入 输入的第一行表示节点的个数n(1<=n<=1000,节点的编号为0到n-1)组成, ...

  6. String Shifting(今日头条2017秋招真题)

    题目链接 题目 我们规定对一个字符串的shift操作如下: shift("ABCD", 0) = "ABCD" shift("ABCD", ...

  7. 和谐敏感词(百度2017秋招真题)

    题目: 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向.暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实际情况,设定一些只适用于本网 ...

  8. 十字架(百度2017秋招真题)深入解析

    题目链接 首先这个题目必定是递归思想,因为大的图形当中又会套上小的图形 其次必须先确定图形的中点,因为由图形的中点可以确定下来图形的位置,从中间向周围加上中间五个方向分布进行递归图形,这里我通过递归一 ...

  9. 敏感词(百度2017秋招真题)

    题目描述 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向.暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实际情况,设定一些只适用于本 ...

最新文章

  1. cron 定时器简单入门
  2. 钉钉接入access_无需开发,IT事件接入钉钉的方法详解
  3. 【PC工具】更新github下载加速器,github项目辅助下载工具,github高速下载
  4. 真得好好细讲文件上传,否则漏洞百出
  5. 前端学习(1401):多人管理21新增用户
  6. python开发程序员应该知道的面试技巧和注意事项
  7. 数据库实验一——数据定义
  8. katacontainers v2编译
  9. [Evolutionary Algorithm] 进化算法简介
  10. 关于 SONY WF1000XM3 在 Windows 10 下蓝牙连接只有 Handfree 没有 Stereo 模式
  11. 十天内提高单词量到20000! (Vocabulary 10000)
  12. 7-2 拍7令四 (100 分)
  13. switch内部执行顺序
  14. SQL server数据库五大实验
  15. 去哪儿cli2项目总结
  16. CDOJ 1321柱爷的恋爱 (区间dp)
  17. 华为怎么分屏操作技巧_第五人格魔术师怎么操作 求生者魔术师操作技巧
  18. 【工业大数据】发展工业大数据,助力天津市先进制造研发基地建设
  19. Windows还原系统后分区故障解决方案
  20. SSM+Maven电费管理系统源码+文档

热门文章

  1. 2022哪款蓝牙耳机性价比高?高品质蓝牙耳机测评
  2. Java练习500题持续更新~
  3. CF_329_B----AcWing_3825_逃离大森林(BFS究极模板)
  4. 力扣 174. 地下城游戏 DFS + Python
  5. html之div元素
  6. 计算机考在职研究生难不难,软件工程在职研究生很难考吗?都考什么科目?
  7. 科研图像压缩算法比例,雷娜_对tinders算法的不科学研究
  8. Android源码之剩余充电时间计算
  9. 国家政策创业扶持资金有哪些申报技巧?
  10. win7亮度显示条消失了