问题描述
俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。
游戏在一个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满分代码分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25843.html