输入格式类似下面这种:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 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
0 0 1 0 0 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
1
第1~15行是输入的原图案,1代表有方块0代表没有。第16~19行是新出来的图形,即要下落的图形,最后一个整数代表新出来的图形在第几列开始下落。上面为1,则代表新给出的4*4矩阵的最左边一列是和原图案第1列对齐的,即下标为0的列。
输入格式限定原图案前四行都为0。下落规则:若碰到为1的方块则停止下落,或者到达原图案底部。
要求输出最后下落完成之后的图案。
我的解题思路:先将要下落的图形在原图案中相应位置表示出来。
用一个二维矩阵记录图形在图案中的位置,行与列。
找出图形中在同一列且为1的点,找出点对应的最大行位置和最小行位置
找出图形中所有为1的点中的最大行位置
在图案中判断图形中所有为1的点所在列的最大行位置下一行是否为1,及最大行位置是否小于图案底部位置
若满足,则将图形中所有为1点所在列的最大行位置下一行置为1,最小行位置下一行置为1,最小行位置置为0,最大和最小行位置加1
代码
package com.ccf.num7;
import java.util.Scanner;
/*
*@author swk
*/
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] data = new int[15][10];
int[][] bankuai = new int[4][4];
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 10; j++) {
data[i][j]=sc.nextInt();
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
bankuai[i][j]=sc.nextInt();
}
}
int start=sc.nextInt()-1;
int counter=0;
int[][] point =new int[4][2];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(bankuai[i][j]==1){
data[i][start+j]=1;
point[counter][0]=i;
point[counter][1]=start+j;
counter++;
}
}
}
int maxline1=point[0][0],minline1=point[0][0],cloumn1=point[0][1];
for(int i=0;i<4;i++){
if(cloumn1==point[i][1]){
if(maxline1<point[i][0]){
maxline1=point[i][0];
}
if(minline1>point[i][0]){
minline1=point[i][0];
}
}
}
int maxline2=point[1][0],minline2=point[1][0],cloumn2=point[1][1];
for(int i=0;i<4;i++){
if(cloumn2==point[i][1]){
if(maxline2<point[i][0]){
maxline2=point[i][0];
}
if(minline2>point[i][0]){
minline2=point[i][0];
}
}
}
int maxline3=point[2][0],minline3=point[2][0],cloumn3=point[2][1];
for(int i=0;i<4;i++){
if(cloumn3==point[i][1]){
if(maxline3<point[i][0]){
maxline3=point[i][0];
}
if(minline3>point[i][0]){
minline3=point[i][0];
}
}
}
int maxline4=point[3][0],minline4=point[3][0],cloumn4=point[3][1];
for(int i=0;i<4;i++){
if(cloumn4==point[i][1]){
if(maxline4<point[i][0]){
maxline4=point[i][0];
}
if(minline4>point[i][0]){
minline4=point[i][0];
}
}
}
int maxline=point[0][0];
for(int i=1;i<4;i++){
if(maxline<point[i][0]){
maxline=point[i][0];
}
}
while(maxline<=13&&data[maxline1+1][point[0][1]]!=1&&data[maxline2+1][point[1][1]]!=1&&data[maxline3+1][point[2][1]]!=1&&data[maxline4+1][point[3][1]]!=1){
data[maxline4+1][cloumn4]=1;
data[minline4][cloumn4]=0;
data[minline4+1][cloumn4]=1;
data[maxline3+1][cloumn3]=1;
data[minline3][cloumn3]=0;
data[minline3+1][cloumn3]=1;
data[maxline2+1][cloumn2]=1;
data[minline2][cloumn2]=0;
data[minline2+1][cloumn2]=1;
data[maxline1+1][cloumn1]=1;
data[minline1][cloumn1]=0;
data[minline1+1][cloumn1]=1;
minline1++;maxline1++;
minline2++;maxline2++;
minline3++;maxline3++;
minline4++;maxline4++;
maxline++;
}
for(int i=0;i<15;i++){
for(int x:data[i]){
System.out.print(x+" ");
}
System.out.print("\n");
}
}
}
样例输入得到的输出为:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 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 1 1 0 0 0 0 0 0
0 1 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0