CCF认证 201604-2 俄罗斯方块

在这里插入图片描述

样例输入:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 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

思路:关键是确定新加入板块的第一行应该停在初始方格图的第几行。对于每一个不为-1的元素Btemp[i](0≤i<4),更新minRow = min(minRow,Atemp[num+i-1]-Btemp[i]-1),最后得到的minRow即为新加入板块的第一行应该停在初始方格图的行数

#include <bits/stdc++.h>
using namespace std;
int a[15][10],b[4][4];
int main() {
	int atmp[10],btmp[4];//atmp记录a中图形上边缘,btmp记录b中图形下边缘
	fill(atmp,atmp+10,15);//填充向量
	fill(btmp,btmp+4,-1);
	for(int i=0;i<15;i++)
		for(int j=0;j<10;j++){
			cin>>a[i][j];
			if(a[i][j]&&atmp[j]>i)
				atmp[j]=i;
		}
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++){
			cin>>b[i][j];
			if(b[i][j])
				btmp[j]=i;
		}
	int col,min_row=15;	cin>>col;
	for(int i=0;i<4;i++)//确定b在a中的行数
		if(btmp[i]>-1)//b中全0,则不考虑
			min_row=min(min_row,atmp[col-1+i]-btmp[i]-1);
	for(int i=0;i<4&&i+min_row<15;i++)
		for(int j=0;j<4;j++)
			if(i+min_row>=0&&b[i][j])
				a[i+min_row][col-1+j]=b[i][j];
	for(int i=0;i<15;i++){
		for(int j=0;j<10;j++)
			cout<<a[i][j]<<' ';
		cout<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值