前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >201604-2 试题名称: 俄罗斯方块

201604-2 试题名称: 俄罗斯方块

作者头像
种花家的奋斗兔
发布2020-11-13 09:51:26
4810
发布2020-11-13 09:51:26
举报
文章被收录于专栏:NLP小白的学习历程

俄罗斯方块

问题描述   俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。   游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块。每一轮,都会有一个新的由4个小方块组成的板块从方格图的上方落下,玩家可以操作板块左右移动放到合适的位置,当板块中某一个方块的下边缘与方格图上的方块上边缘重合或者达到下边界时,板块不再移动,如果此时方格图的某一行全放满了方块,则该行被消除并得分。   在这个问题中,你需要写一个程序来模拟板块下落,你不需要处理玩家的操作,也不需要处理消行和得分。   具体的,给定一个初始的方格图,以及一个板块的形状和它下落的初始位置,你要给出最终的方格图。 输入格式   输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。   输入的第16至第19行包含新加入的板块的形状,每行包含4个数字,组成了板块图案,同样0表示没方块,1表示有方块。输入保证板块的图案中正好包含4个方块,且4个方块是连在一起的(准确的说,4个方块是四连通的,即给定的板块是俄罗斯方块的标准板块)。   第20行包含一个1到7之间的整数,表示板块图案最左边开始的时候是在方格图的哪一列中。注意,这里的板块图案指的是16至19行所输入的板块图案,如果板块图案的最左边一列全是0,则它的左边和实际所表示的板块的左边是不一致的(见样例) 输出格式   输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。 样例输入 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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

代码语言:javascript
复制
#include <iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>


using namespace std;

int main()
{
	int a[15][10];
	int b[4][4];
	int start;
	int upborder[4]={14,14,14,14},lowborder[4]={-10,-10,-10,-10};
	for(int i=0;i<15;i++)
		for(int j=0;j<10;j++)
			cin>>a[i][j];
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			cin>>b[i][j];
	cin>>start;
	start=start-1;
	for(int i=start;i<start+4;i++)     //原始数组的上界 
		for(int j=0;j<15;j++)
			if(a[j][i]==1)
			{
				upborder[i-start]=j-1;
				break;
			}
	for(int i=0;i<4;i++)         //输入数组的下界 
		for(int j=0;j<4;j++)
			if(b[j][i]==1)
				lowborder[i]=j;
	int minx(20);
	int t(0);
	for(int i=0;i<4;i++)    //对比得最小距离 
		if(upborder[i]-lowborder[i]<minx)
		{//标记最短距离,并计算哪一列最高
			minx=upborder[i]-lowborder[i];
			t=i;
		}
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			if(b[i][j]==1)//标记
				a[upborder[t]-lowborder[t]+i][start+j]=1;
	for(int i=0;i<15;i++)
	{//输出
		for(int j=0;j<10;j++)
		{
			if(j==0)
				cout<<a[i][j];
			else
				cout<<" "<<a[i][j];
		}	
		cout<<endl;
	}
	return 0;
}

注意:先分析问题,不要急着分类讨论,你可能分类讨论上百行还不如仔细分析后写几十行。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 俄罗斯方块
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档