第七次CCF认证考试 题目二模拟俄罗斯方块下落的过程

输入格式类似下面这种:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 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~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 

感觉自己这样做很复杂,没有用到java里的一些其他数据结构,希望各位大神给点意见,怎么简单一点。




  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值