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;
}
发布了99 篇原创文章 · 获赞 44 · 访问量 5506

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/103496130