试题编号: | 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 |
题目解析:
- 我现在需要重新认识一下CCF的第二题了,其实都是暴力解决
- 用类化的方法会简单很多
- 直接暴力解决
这道题就是典型的暴力解决,与跳一跳有很大区别https://blog.csdn.net/qq_40479037/article/details/82389109
正式开始说思路:
使用两个数组,一个表示棋盘,一个表示下落块
两个数组元素都是由0和1组成,所以乘积为1,就表示有重合,终止循环,找到最上面的位置。
将第16行全置1是为了防止特殊情况出现,如图:
若不置1,则会出错
# include<iostream>
# include<cstdio>
# include<cstdlib>
# include<cstring>
# include<string>
# include<cmath>
# include<algorithm>
using namespace std;
int map[17][11];
int block[5][5];
int pos,loc = 1;
bool ok(int r)
{
for(int i = r;i < r + 4;++i)
for(int j = pos;j < pos+4;++j)
{
if(map[i][j] * block[1+i-r][1+j-pos])
return false;
}
return true;
}
int main()
{
/*输入*/
for(int i = 1;i <= 15;++i)
for(int j = 1;j <= 10;++j)
scanf("%d",&map[i][j]);
for (int j = 1; j <= 10; j++)
map[16][j] = 1;//使模块的最后一列全为1,设置底线,防止特殊情况
for(int i = 1;i <= 4;++i)
for(int j = 1;j <= 4;++j)
scanf("%d",&block[i][j]);
scanf("%d",&pos);
for(int i = 1;i <= 15 && ok(i);++i)
loc = i;
//printf("%d\n",loc);//13
for(int i = loc;i < loc+4;++i)
for(int j = pos;j < pos+4;++j)
{
map[i][j] += block[i-loc+1][j-pos+1];
}
for(int i = 1;i <= 15;++i)
{
for(int j = 1;j <= 10;++j)
printf("%d ",map[i][j]);
printf("\n");
}
return 0;
}