当前位置: 首页 > news >正文

C++程序设计:俄罗斯方块(模拟方块下落,经典问题)

【问题描述】

  俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。
  游戏在一个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

#include <iostream>
using namespace std;
int main() {
	int a[15][10];//初始方格图 
	int i,j;
	for(i=0; i<15; i++)
		for(j=0; j<10; j++)
			cin>>a[i][j];
	int b[4][4];//下落中的板块 
	for(i=0; i<4; i++)
		for(j=0; j<4; j++)
			cin>>b[i][j];
	int place;//下落板块的左右位置(横坐标,题目中从1开始)
	cin>>place;
	int step;//下落板块的上下位置(纵坐标,设为从1开始)
	for(step=1; step<16; step++)
		for(i=step-1; i<step+3; i++) //step从1开始,对应于数组从0开始 
			for(j=place-1; j<place+3; j++) //place从1开始,对应于数组从0开始 
				//一步步模拟下落,直至发生冲突(同一位置两个1) 
				if(a[i][j]+b[i-(step-1)][j-(place-1)]==2)
					goto here;
here:
	//回退一步,即为最终位置 
	step-=1;
	for(i=step-1; i<step+3; i++)
		for(j=place-1; j<place+3; j++)
			if (b[i-step+1][j-place+1]==1)
				//计算最终方格图 
				a[i][j]=b[i-step+1][j-place+1];
	for(i=0; i<15; i++) {
		for(j=0; j<10; j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

 

相关文章:

  • Eclipse快速上手指南 (4)
  • 经典非对称加密算法:RSA算法原理、实现详解(C++、Java)
  • VGA显示卡图形模式访问(提示版) (2)
  • 【亲测有效】IDEA连接MySQL数据库时“Server returns invalid timezone”时区问题的解决方法
  • 使用dbms_rectifier_diff解决高级复制中的数据冲突问题
  • 非常好用的在线画树网站(树结构的自动生成工具,免去手动画树的烦恼)
  • Dev-Cpp/Mingw32 环境介绍(6)
  • 【解决方案】使用Wireshark工具抓取TCP数据包时为什么遇到了52.114.77.164与168.63.202.111?
  • t.k.x's ACM(2)---不敢报希望的准备
  • C++面向对象程序设计:银行储蓄管理系统
  • C++面向对象程序设计:地铁自动售票系统
  • t.k.x's ACM(3)---险过的网上预赛
  • 计算机网络实验: 使用Wireshark抓包工具进行应用层和传输层网络协议分析(TCP部分)
  • t.k.x's ACM(5)---平静的上海
  • 计算机网络实验: 使用Wireshark抓包工具进行应用层和传输层网络协议分析(HTTP部分)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 345-反转字符串中的元音字母
  • CentOS7 安装JDK
  • export和import的用法总结
  • Java多态
  • passportjs 源码分析
  • win10下安装mysql5.7
  • 大数据与云计算学习:数据分析(二)
  • 翻译:Hystrix - How To Use
  • 浮动相关
  • 关于Flux,Vuex,Redux的思考
  • 前端工程化(Gulp、Webpack)-webpack
  • 树莓派 - 使用须知
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 突破自己的技术思维
  • 我从编程教室毕业
  • 协程
  • 责任链模式的两种实现
  • MPAndroidChart 教程:Y轴 YAxis
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​flutter 代码混淆
  • ​香农与信息论三大定律
  • # 数据结构
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.each()与$(selector).each()
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (超详细)语音信号处理之特征提取
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (转)人的集合论——移山之道
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法