转载自:https://blog.csdn.net/wd2014610/article/details/98204878
因为得了90分,说明我的代码并不全对,还有我没有注意到的地方,所以我就看看大神的思路,果然很清晰
试题编号: | 201604-2 |
试题名称: | 俄罗斯方块 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。 输入格式 输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。 输出格式 输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。 样例输入 0 0 0 0 0 0 0 0 0 0 样例输出 0 0 0 0 0 0 0 0 0 0 |
一下是大神的分析过程:
import java.util.Scanner;
/**
* 遇见这样的复杂图像题目
* 不要慌,先想办法将图片以合适的方式,完整的录入进来再说
* @author wangdong
*
*/
public class Main {
public static void main(String[] args) {
Main.run();
}
public static void run() {
Scanner scanner = new Scanner(System.in);
int[][] arr = new int[15][10];
int[][] arrSqu = new int[4][4];
//将输入的方格图存入数组
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 10; j++) {
arr[i][j] = scanner.nextInt();
}
}
//将输入的方块存入数组
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
arrSqu[i][j] = scanner.nextInt();
}
}
//获取方块将要下沉的位置,偏移
int column = scanner.nextInt();
scanner.close();
//获取这个方块值为1的每个节点在4*4矩阵中的位置
int[] x = new int[4];
int[] y = new int[4];
int z = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (arrSqu[i][j] == 1) {
x[z] = i;
y[z] = j+column-1;
z++;
}
}
}
boolean flag = true;
int count = 0;
int offset = 0;
outer:
while (flag) {
for (int i = 0; i < 4; i++) {
//判断最下面的边界,如果有一个方块到了最下面,直接结束下沉
if ((x[i] + offset) == 14) {
for (int j = 0; j < 4; j++) {
arr[x[j] + offset][y[j]] =1;
}
break outer;
}
if (arr[x[i] + offset][y[i]]==0) {//不断下沉
count++;
}
}
if (count == 4) {
offset++;
count=0;
}else {
for (int i = 0; i < 4; i++) {
arr[x[i] + offset -1][y[i]] = 1;
}
flag = false;
}
}
//遍历下沉后的矩阵
for(int i=0;i<15;i++){
for(int j=0;j<10;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
感觉讲的非常透彻,特别好,值得我学习