先上菜:
问题描述 俄罗斯方块简单模拟。 在这个问题中,你需要写一个程序来模拟板块下落,你不需要处理玩家的操作,也不需要处理消行和得分。 具体的,给定一个初始的方格图,以及一个板块的形状和它下落的初始位置,你要给出最终的方格图。 输入格式 输入的前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心塞路程:被这道题折腾了好久,差点放弃(才第二题)从0分到100分(0→30→40→60→80→100)还是坚持下来了。起初是找准位置的问题,后来是上界的问题...主要还是基础不扎实,练得少。最后解决20分得益于一篇博客下评论的一位朋友,不晓得是谁还是感谢了。努力学习
以下是我的代码(带注释会编译错误,不晓得为啥,不管了~)
代码还有改进的地方,先留着吧。
/* * 把图案从下往上比对。 * */ import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int [][]arr = new int[15][10]; int [][]brr = new int[4][4]; for(int i=0;i<15;i++){ for(int j=0;j<10;j++){ arr[i][j] = in.nextInt();//输入初始方格图 } } for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ brr[i][j] = in.nextInt();//输入板块矩阵 } } int num = in.nextInt(); //输入下落起始位置 jiMu(arr,brr,num); } static void jiMu(int arr[][],int brr[][],int n) { int []h = new int[4]; int []l = new int[4]; int k = 0; int t = 0; for(int i=0;i<4;i++){ //用h[]和l[]两个矩阵分别存储板块矩阵中1的行下标和列下标 for(int j=0;j<4;j++){ if(brr[i][j] == 1){ h[k++] = i; l[t++] = j; } } } for(int x=14;x>0;x--){ //从最后一行开始向上比对 int temp=0; int tag =0; for(int y=3;y>=0;y--){ if(arr[x+h[y]-h[3]][n+l[y]-1]==0){//在初始方格图中找方块的对应位置 for(int z=0;z<x+h[y]-h[3];z++){//找到位置要判断该位置所在列以上的元素都为0; if(arr[z][n+l[y]-1]==0) tag++; } if(tag==x+h[y]-h[3]) {temp++;tag=0;}//若满足全为0,计数 } else { temp=0; break; } } if(temp==4){ //当计数为4时,即找到方块要放到的位置,将其置1; for(int m=3;m>=0;m--){ arr[x+h[m]-h[3]][n+l[m]-1]=1; } for(int i=0;i<15;i++){ for(int j=0;j<10;j++){ System.out.print(arr[i][j]+" "); } System.out.println(); } return; } } } }