ccf题库中2016年4月2日俄罗斯方块问题
题目如下:
问题描述
俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。
游戏在一个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个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。
样例输入 样例输出
网上一般是模拟方块下落的过程,这种方法简洁,易于理解,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
struct Node{
int x;
int y;
};
int main()
{
int s[][];
Node t[];
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
cin>>s[i][j];
}
}
int count=;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
int temp;
cin>>temp;
if(temp==)
{
t[count].x=i;
t[count].y=j;
count++;
}
}
}
int col;
cin>>col;
if(col+>=)
{
return ;
}else{
for(int i=;i<;i++)
{
t[i].y+=col-;
}
}
int flag=;
while()
{
for(int i=;i<;i++)
{
if(s[t[i].x][t[i].y])
{
flag=;
break;
}
}
if(flag)
{
break;
}else{
for(int i=;i<;i++)
{
t[i].x++;
}
}
}
if(flag==)
{
for(int i=;i<;i++)
{
s[t[i].x-][t[i].y]=;
}
}
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
cout<<s[i][j]<<" ";
}
cout<<endl;
}
return ;
}
我刚开始的想法是,为什么不从最后一行开始,那样不是更快吗?后来我发现这个想法不对,从下往上找,要一直遍历到第0行,这样的计算量特别大。
下面,我说说自己的想法:先通过遍历找到对应方块在大矩阵中的最下面一行,然后以这个行数为标准来将图形填充到大的矩阵中。详细说明,在代码中。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
int x;
int y;
int row;
};
int cmp(Node x,Node y)
{
return x.x>y.x;
}
int main()
{
int s[][];
Node t[];
Node temp[];//在这里t用作遍历时的数组,temp主要是方便赋值
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
cin>>s[i][j];
}
}
int count=;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
int tem;
cin>>tem;
if(tem==)
{
t[count].x=i;
t[count].y=j;
t[count].row=;
temp[count].x=i;
temp[count].y=j;
temp[count].row=;
count++;
}
}
}
int col;
cin>>col;
if(col+>=)
{
return ;
}else{
for(int i=;i<;i++)
{
t[i].y+=col-;
temp[i].y+=col-;
}
}
sort(t,t+,cmp);
sort(temp,temp+,cmp);
//-----------------找出最下面的一行-------------------------
int row,real_row;
for(real_row=;real_row>=;real_row--){//一行一行的遍历,从最底层开始。
row=real_row;
int flag;
for(;row>=;row--)//将从最低行一直遍历到第0行
{
int temp_row=row;
flag=;
for(int j=;j<;j++)
{
if(j==){
if(temp_row<){
break;
}
if(s[temp_row][t[j].y]==){
flag=;//标记失败
break;
}else{
temp_row=temp_row-t[j].x+t[j+].x;
}
}else{
if(temp_row<){
break;
}
if(s[temp_row][t[j].y]==){
flag=;//标记失败
break;
}else{
if(j<=){
temp_row=temp_row-t[j].x+t[j+].x;
}
}
}
}
if(flag==){//出现失败后没有必要在遍历了,跳出循环,对下一个real_row进行从real_row到0的遍历
break;
}
}
if(flag==){//说明出现了满足情况的行数,停止执行。
break;
}
}
//--------------重新赋值--------------------
// cout<<"最终行数为:"<<real_row<<endl;
for(int i=;i<;i++)
{
if(i==){
temp[i].x=real_row;
real_row=real_row-t[].x+t[].x;
}else{
temp[i].x=real_row;
if(i<=){
real_row=real_row-t[i].x+t[i+].x;//利用小矩阵中函数差,来确定对应的大矩阵中的行数,例如,t[0]在小矩阵中是第二行,t[1]在小矩阵中是第一行,t[0]在大矩阵中是第13行,那么t[1]应该是13-2+1=12行
}
}
s[temp[i].x][temp[i].y]=;
}
//--------------输出结果--------------------
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
cout<<s[i][j]<<" ";
}
cout<<endl;
}
return ;
}
ccf题库中2016年4月2日俄罗斯方块问题的更多相关文章
- ccf题库中2015年12月2号消除类游戏
题目如下: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这 ...
- c++中变量声明和变量定义的区别。2016年12月6日
整个流程: 1.程序告诉cpu,程序将要使用一个变量.(暂时不一定用到,先说一下.) 2.程序告诉CPU,程序现在就要使用一个变量.(现在就用) 3.cpu按照这个变量的类型,把内存划分出几个单位(b ...
- 我的Python成长之路---第八天---Python基础(24)---2016年3月5日(晴)
多线程编程 什么是多线程,线程是操作系统能够进行运算调度的最小单位.他包含在进程之中,是进程中的实际运作单位.线程是进程中一个单顺序的空值六,一个进程可以并发多个线程,每个线程可以并行处理不同的任务. ...
- Git学习(二)(2015年11月18日)(2016年1月29日)
2015年11月18日Git学习: .Shell 删除文件夹及其所有文件 rd/s/q 文件目录 ---------------当前为先创建本地Git库后与网上Git服务器关联------------ ...
- 2016年2月16日开始,每天一篇,记录学习心得,【基本技能篇】>>开篇《如何阅读一本书——心得》
如何阅读一本书——心得 ——2016年2月12日 要达到阅读的所有目的,就必须在阅读不同书籍的时候,运用适当的不同速度.读的太快或太慢,都一无所获. 四个阅读层次:①基础阅读,具有基本阅读的能力,包括 ...
- Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档
array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...
- Yoshua Bengio 2016年5月11日在Twitter Boston的演讲PPT
Yoshua Bengio最新演讲:Attention 让深度学习取得巨大成功(46ppt) Yoshua Bengio,电脑科学家,毕业于麦吉尔大学,在MIT和AT&T贝尔实验室做过博士后研 ...
- 2016年11月2日 星期三 --出埃及记 Exodus 19:18
2016年11月2日 星期三 --出埃及记 Exodus 19:18 Mount Sinai was covered with smoke, because the LORD descended on ...
- 2016年10月31日 星期一 --出埃及记 Exodus 19:16
2016年10月31日 星期一 --出埃及记 Exodus 19:16 On the morning of the third day there was thunder and lightning, ...
随机推荐
- Ubuntu 16 桌面版使用笔记
版本:16.04.2-Ubuntu 软件安装 常用软件 sudo apt-get install curl wget htop git vim 搜狗输入法 wget http://cdn2.ime.s ...
- phpStorm使用技巧总结
工欲善其事,必先利其器. 拥有一个好的工具不仅可以事半功倍,而且也令人神清气爽. 在编辑器上,我所走过的路是这样的:notepad(对,就是最原始的WIN下的note) -> editplus ...
- ADNI数据
之前整理的数据相关内容 数据的模态有 Clinical Data(临床数据) Genetic(基因数据) MRI PET BIOSPECIMEN(生物样本) 各模态数据的内容.特点 Clinical ...
- Scala函数与函数式编程
函数是scala的重要组成部分, 本文将探讨scala中函数的应用. scala作为支持函数式编程的语言, scala可以将函数作为对象即所谓"函数是一等公民". 函数定义 sca ...
- NAT与网桥
CentOS设置虚拟网卡做NAT方式和Bridge方式桥接 时间:2015-02-25 23:30来源:blog.51cto.com 作者:samlei 摘要:KVM虚拟机网络配置的两种方式:N ...
- Abp中自定义Exception的HttpStatusCode
Abp中在新版本中,抛出的异常(比如:UserFriendlyException)通过AjaxResponse封装后返回的时候,HttpStatusCode默认指定成了500. 对于一些默认封装好的处 ...
- Windows安装diango框架<一>
下一篇:使用Django创建网站项目<二> python工具安装 python下载:https://www.python.org/downloads/windows/(我的版本3.7.0) ...
- Java学习笔记之——switch-case条件结构
语法: switch(变量){ case 常量1: 执行语句: break: case 常量2: 执行语句: break: case 常量3: 执行语句: break: ………… default: 语 ...
- Java坦克大战(四)
这是我的坦克游戏大战的最后一版,里面添加很多新的功能.这个坦克大战的有很多不足之处,但是对于初学者来说依然是一个很好的练习项目,从中我们可以学习Java基础知识,将知识与项目结合,学习面向对象编程思想 ...
- 01-初始Java
1. 你学习编程的目的是什么?学习编程最快的办法是什么? 答:我喜欢计算机,想更多的了解计算机的原理:我认为学习最快的办法就是尝试,只有不断地在计算机上尝试编程,遇到错误, 解决错误,才能更快的学会编 ...