您的位置:首页 > 编程语言 > Java开发

201604-2 俄罗斯方块(java) CCF

2017-09-10 09:40 375 查看
问题描述

  俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。

  游戏在一个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

作为一个渣渣的我,第一次发,只能这样了。勿喷,错误可以指正。




import java.util.Scanner;

public class BlockMove2 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=15;
int n=10;
int[][] map=new int[m]
;
//初始化地图
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
map[i][j]=sc.nextInt();
}
}
int moveM=4;
int moveN=4;
int[][] move=new int[moveM][moveN];
int[] xIndex=new int[4];
int[] yIndex=new int[4];
int count=0;
//接收方块,并获取有的部分
for(int i=0;i<moveM;i++){
for(int j=0;j<moveN;j++){
move[i][j]=sc.nextInt();
if(move[i][j]==1){
//获取方块的位置值
xIndex[count]=i;
yIndex[count]=j;
count++;
}
}
}
int line=sc.nextInt();
line--;
sc.close();
//把方块与地图对应起来
for(int i=0;i<moveM;i++){
yIndex[i]+=line;
}
while(true){
boolean isR=false;
for(int j=0;j<m;j++){
//因为不移动,所以i在line+moneM之间
for(int i=line;i<moveM+line;i++){
//判断每个点的下一行是否为1,即已有方块
if(xIndex[moveM+line-i-1]+1==15||map[xIndex[moveM+line-i-1]+1][yIndex[moveM+line-i-1]]==1){
isR=true;
break;
}else{
isR=false;
}
}
//经过一轮对比,不满足条件则每一个的行数加一
if(isR==false){
for(int ii=0;ii<moveM;ii++){
xIndex[ii]++;
}
}
if(isR==true){
break;
}

}
//遍历打印
if(isR==true){
for(int i=0;i<moveM;i++){
map[xIndex[i]][yIndex[i]]++;
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
break;
}
}
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: