问题描述

  俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。
  游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块。每一轮,都会有一个新的由4个小方块组成的板块从方格图的上方落下,玩家可以操作板块左右移动放到合适的位置,当板块中某一个方块的下边缘与方格图上的方块上边缘重合或者达到下边界时,板块不再移动,如果此时方格图的某一行全放满了方块,则该行被消除并得分。
  在这个问题中,你需要写一个程序来模拟板块下落,你不需要处理玩家的操作,也不需要处理消行和得分。
  具体的,给定一个初始的方格图,以及一个板块的形状和它下落的初始位置,你要给出最终的方格图。

输入格式

  输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。
  输入的第16至第19行包含新加入的板块的形状,每行包含4个数字,组成了板块图案,同样0表示没方块,1表示有方块。输入保证板块的图案中正好包含4个方块,且4个方块是连在一起的(准确的说,4个方块是四连通的,即给定的板块是俄罗斯方块的标准板块)。
  第20行包含一个1到7之间的整数,表示板块图案最左边开始的时候是在方格图的哪一列中。注意,这里的板块图案指的是16至19行所输入的板块图案,如果板块图案的最左边一列全是0,则它的左边和实际所表示的板块的左边是不一致的(见样例)

输出格式

  输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。

样例输入

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 0 0 0 1 1 1 1
0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
3

样例输出

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 0 0 0 0

这道题目实在是难倒我,一开始思路不正确浪费了很多时间,现在简单记录下写这道题的历程。

我的思路是:1.将4*4矩阵中的方块抠出来,用两个一维数组x[]和y[]来表示方块在矩阵的位置。2.将x[]和y[]置于15*10的矩阵中,不断的下沉,碰到1就停止,位置就为当前y轴减去1。3.如果一直有一个方块,碰到最底下(15*10的边界),将整个循环结束。

两个关键点:1.用一维数组x[]和y[]记录方块在矩阵中的位置,而不是二维数组。这样可以矩阵只需要一个for循环就能的遍历方块。             即:

        int[] x=new int[4];int[] y=new int[4];int z=0;//把方块的X位置和Y位置分别放入x[]和y[]中。for(int i=0;i<block.length;i++){for(int j=0;j<block[i].length;j++){if(block[i][j]==1){x[z]=i;y[z]=j+n-1;z++;}}}for(int i=0;i<4;i++){if(table[x[i]][y[i]]==0){//这里只需要一个for循环就能够从矩阵中遍历所有方块,非常聪明!}}

2.跳出多重循环命令:

OUT:

//

break OUT:

OUT://这里标注位置while(flag){for(int i=0;i<4;i++){if(x[i]+offset==14){for(int j=0;j<4;j++){table[x[j]+offset][y[j]]=1;}break OUT;   //这里跳出多重循环}if(table[x[i]+offset][y[i]]==0){count++;}}if(count==4){offset++;count=0;}else{for(int i=0;i<4;i++){table[x[i]+offset-1][y[i]]=1;}flag=false;}}

完整代码如下:

import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc=new Scanner(System.in);int[][] table=new int[15][10];int[][] block=new int[4][4];for(int i=0;i<table.length;i++){for(int j=0;j<table[i].length;j++){table[i][j]=sc.nextInt();}}for(int i=0;i<block.length;i++){for(int j=0;j<block[i].length;j++){block[i][j]=sc.nextInt();}}int n=sc.nextInt();int[] x=new int[4];int[] y=new int[4];int z=0;for(int i=0;i<block.length;i++){for(int j=0;j<block[i].length;j++){if(block[i][j]==1){x[z]=i;y[z]=j+n-1;z++;}}}int count=0;int offset=0;boolean flag=true;OUT:while(flag){for(int i=0;i<4;i++){if(x[i]+offset==14){for(int j=0;j<4;j++){table[x[j]+offset][y[j]]=1;}break OUT;   }if(table[x[i]+offset][y[i]]==0){count++;}}if(count==4){offset++;count=0;}else{for(int i=0;i<4;i++){table[x[i]+offset-1][y[i]]=1;}flag=false;}}for(int i=0;i<table.length;i++){for(int j=0;j<table[i].length;j++){System.out.print(table[i][j]+" ");}System.out.println();}}}

CCF201604-2 俄罗斯方块 java满分代码相关推荐

  1. CCF之小明上学——2018.12 第一题 (java满分代码)

    package Question_one; /*  * 小明上学  * 题目背景 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校.为了能尽可能充足地睡眠,他希望能够预计自己上 ...

  2. CCF 俄罗斯方块(满分代码 + 解题思路 + 技巧总结)201604 - 2

    技巧总结 对于需要先判断可不可以再进行"填充"数组的操作,可以利用memcpy,在一个新的数组上"试错" 小数组在大数组中实现遍历,可以利用小数组的行列遍历,然 ...

  3. CCF认证历年真题 满分代码(更新至2018年12月)

    目标是集齐所有CCF认证试题的满分代码! 每次考试出题一般规律: 第一题:水题(稍微有些编程经验就可以写) 第二题:小模拟(处理比较简单的问题,掌握C++STL很有帮助) 第三题:大模拟(处理复杂的问 ...

  4. 俄罗斯方块java源代码提供

    俄罗斯方块--java源代码提供   import java.awt.*; import java.awt.event.*; //俄罗斯方块类 public class ERS_Block exten ...

  5. CCF认证历年真题 满分代码

    目标是集齐所有CCF认证试题的满分代码! 每次考试出题一般规律: 第一题:水题(稍微有些编程经验就可以写) 第二题:小模拟(处理比较简单的问题,掌握C++STL很有帮助) 第三题:大模拟(处理复杂的问 ...

  6. java编写代码用什么_如何学习用Java编写代码:为什么要学习以及从哪里开始

    java编写代码用什么 by John Selawsky 约翰·塞劳斯基(John Selawsky) 如何学习用Java编写代码:为什么要学习以及从哪里开始 (How to learn to cod ...

  7. Java 常用代码汇总

    欢迎关注方志朋的博客,回复"666"获面试宝典 1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric ...

  8. 陌陌安全开源了 Java 静态代码安全审计插件

    近日,陌陌安全开源了 Java 静态代码安全审计插件 MOMO Code Sec Inspector,侧重于在编码过程中发现项目潜在的安全风险,并提供一键修复能力. MOMO 安全团队认为,绝大部分 ...

  9. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

最新文章

  1. 基于计算机视觉的构件表面缺陷特征提取
  2. android 调用系统相机
  3. Eclipse调试方法
  4. 小程序开发(1)-之目录结构和文件说明
  5. python常用模块之requests
  6. Vuebnb 一个用 vue.js + Laravel 构建的全栈应用
  7. Go:一次 exit code 是 137 且 无 coredump 的排错经历
  8. 《夏洛特烦恼》观后感
  9. python数字华容道算法_用React写一个数字华容道,你需要知道的秘密
  10. Spring框架-IOC
  11. 使用 Cloudreve 快速搭建一个强大的个人云盘
  12. 在64位Windows的VS软件中使用C/C++调用gnuplot画图
  13. solidworks2022 - 双开
  14. c++ 编译error
  15. 【小5聊】小程序之体验版本wx.chooseImage选择图片上传可以,而线上正式版本选择图片一闪而过的原因
  16. 【文献阅读】MSPM: A multi-agent reinforcement learning-based system for financial portfolio management
  17. U930 换字库后WIFI和蓝牙MAC改变的完美修复方法
  18. 科普:什么是零知识证明?与区块链的关系?
  19. 金融科技加持下,看中国农业银行转型的破局之路
  20. 常见开发语言擅长领域

热门文章

  1. 【综合类型第 14 篇】英雄联盟之原画“永恩“
  2. 茶楼软件如何做报表?有哪些功能模块?
  3. 2023年1月28日(星期六):骑行侧卧云
  4. PDF.js实现行定位功能(通过外部点击跳转到某一行)
  5. 易维帮助台让IT服务从部门级应用到企业级应用
  6. Linux系统开机自启动程序设置
  7. apache beam 入门之beam-sql
  8. 特斯拉面试流程曝光,看看参考价值
  9. LaTex做PPT、图片放置、公式输入等经验贴
  10. 想拿高薪?先避开这几个坑!