解题思路:
重点:在下降方形中肯定有一个影响位置存在的一个‘1’点,找到该点即可。
只需计算在下降方块(即第二个输入的正方形)其中为1的位置处最低可以放在大矩形(第一个输入的矩形)的第几行。
找到最低放的那个1,与大矩形中位置相对应,把输入的正方形相应的位置和大矩形相应位置对照,把相应位置的0变为1即可。
不知道问题出在哪里,只得了90分。
#include <iostream>
using namespace std;
int main()
{
int arr[16][11]={0};//存储大矩形
int small[5][5]={0};//存储小正方形
for(int i=1;i<=15;i++)
{
for(int j=1;j<=10;j++)
{
cin>>arr[i][j];
if(arr[0][j]==0&&arr[i][j]==1)//将大矩形中每一列最靠上面的1所在的行保存在该列的0行处
{
arr[0][j]=i;
}
}
}
int storex=0;
int storey=0;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cin>>small[i][j];
if(i>small[0][j]&&small[i][j]==1)
{
small[0][j]=i;//将小正方形中每一列最下面的1的行保存在该列的0行处,因为只有一列中最下面的1会影响位置
}
}
}
int lie;
cin>>lie;
int min=100;
int storey1=0;
//计算影响位置存放的那个1位于哪个位置
/*
*min————影响位置存放的那个1在大矩形中的行
*storey————影响位置存放的那个1大在矩形的列
*storey1————影响位置存放的那个1在小矩形中的列
* */
for(int i=1;i<=4;i++)
{
if(small[0][i]!=0)
{
if(arr[0][lie+i-1]!=0&&arr[0][lie+i-1]-1<min)
{
min=arr[0][lie+i-1]-1;
storey=lie+i-1;
storey1=i;
}
}
}
//特殊情况,如果大矩形中要放得那几列都不存在1,即small[i][j]!=0
if(min==100)
{
min=15;
int max=0;
for(int i=1;i<=4;i++)
{
if(small[0][i]>max)
{
max=small[0][i];
storey1=i;
}
}
storey=lie+storey1-1;
}
int x=0;
int y=0;
//对应位置的0变1
for(int i=min-small[0][storey1]+1;i<=15&&i<=min-small[0][storey1]+4;i++)
{
x++;
for(int j=lie;j<=lie+3;j++)
{
y++;
if(y>4)
y=y-4;
if((arr[i][j]==1)||(small[x][y]==1))
{
arr[i][j]=1;
}
}
}
for(int i=1;i<=15;i++)
{
for(int j=1;j<=10;j++)
{
cout<<arr[i][j];
if(j<=10)
{
cout<<" ";
}
}
if(i<=15)
{
cout<<endl;
}
}
return 0;
}
问题描述
试题编号: | 201604-2 |
试题名称: | 俄罗斯方块 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。 输入格式 输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。 输出格式 输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。 样例输入 0 0 0 0 0 0 0 0 0 0 样例输出 0 0 0 0 0 0 0 0 0 0 |