CCF 201604-2 俄罗斯方块
第一眼看到题目会比较吓人,但是其要求实现的点并不难。关键在于找到最小下降距离!另!一定要审清输入数据内容类别!我一开始就是把题意理解错了TAT,误把最后输入的数据当做掉入块最左有效边缘开始的位置,聪明反被聪明误。so想清楚再动手!!上Java满分代码:
import java.util.Scanner;
public class Main {
static int[][] board = new int[16][11];
static int[][] input = new int[4][4];
public static int minimalDrop(int index,int variable_row) {
int mini = 15;
int temp = 0;
for(int i=variable_row; i<4; i++) {
for(int j=0; j<4; j++) {
if(input[i][j]==1) {
for(int k=i-variable_row+1; k<15; k++) {
if(board[k][index+j]==0) {temp++;}
else {break;}
}
if(temp<mini)mini=temp;
temp=0;
}
}
}
return mini;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
for(int i=0 ; i<15 ; i++) {
for(int j=0 ; j<10 ; j++) {
board[i][j] = scanner.nextInt();
}
}
for(int i=0; i<4; i++) {
for(int j=0; j<4; j++) {
input[i][j] = scanner.nextInt();
}
}
int index = scanner.nextInt();
scanner.close();
int variable_row = 0;
boolean flag = false;
for(int i=0; i<4; i++) {
if(flag)break;
for(int j=0; j<4; j++) {
if(input[i][j]==1) {
variable_row=i;
flag=true;
break;
}
}
}
int mini = minimalDrop(index-1,variable_row);
for(int i=variable_row; i<4; i++) {
for(int j=0; j<4; j++) {
if(input[i][j]==1) {
board[i-variable_row+mini][index-1+j]=1;
}
}
}
for(int i=0 ; i<15 ; i++) {
for(int j=0 ; j<10 ; j++) {
System.out.print(board[i][j]+" ");
}
System.out.println();
}
}
}