csp201604-2 俄罗斯方块
时间: 2023-11-28 21:34:52 浏览: 151
俄罗斯方块
<<引用:题目分析 因为这道题的数据量不大,只是一个15 * 10的二维数组,因此可以直接暴力求解。方格图有15行10列,但是对我们有用的只有4列,假设用变量column存放开始的时候板块图案最左边在方格图的列号,那么对我们有用的列号就是从column到column 3,将其减一就可对应到数组中。题目中说过方格图的前四行一定是0,因此从第五行开始,判断模板图案的最后一行能否放在方格图的第五行,若能,则判断第六行,一直到第十五行或者不能放置为止。要注意一点,模板图案的最后一行不一定是4,如果模板图案的第四行全是0,且第三行不全为0,那么模板图案的最后一行是3,依次类推。>>
对于这个题目,我们可以采用暴力求解的方法。首先,我们知道方格图是一个15行10列的二维数组,我们只需要关注其中的4列即可。假设我们用变量column来表示板块图案最左边在方格图的列号,那么对我们有用的列号就是从column到column+3。要将列号转换为数组中的索引,只需要将其减一即可。
题目中指出方格图的前四行一定是0,所以我们从第五行开始判断。我们判断模板图案的最后一行能否放置在方格图的第五行,若能,则继续判断第六行,一直到第十五行或者不能放置为止。需要注意的是,模板图案的最后一行不一定是4,如果模板图案的第四行全是0,且第三行不全为0,那么模板图案的最后一行是3,以此类推。
现在,让我们来阅读下面的代码,看看如何实现这个思路:
<<引用:ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int n, m;
int g[N][N], s[N][N];
int p; // x,y是4*4的小方块的左上角的坐标
bool draw(int x, int y){
memcpy(s, g, sizeof g); // s是个新的画布,用于最后输出
//将4*4的小方块画到新画布里
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
if(p[i][j]){
int a = x + i, b = y + j; // a,b的坐标是左上角偏移量
s[a][b] ++;
if(s[a][b] == 2) return true;
}
return false;
}
int main(){
for(int i = 0; i < 15; i++)
for(int j = 0; j < 10; j++)
cin >> g[i][j];
// 最下面一行补上一层地板
for(int i = 0; i < 10; i++)
g[15][i] = 1;
// 读入4*4的小方格
for(int i = 0; i < 4 ; i++)
for(int j = 0; j < 4; j++)
cin >> p[i][j];
int c;
cin >> c;
c--; // 读入的时候下标从1开始,变成下标从0开始
for(int i = 0; ; i++){
if(draw(i, c)){ //新来的4*4的左上角的下标:i行,j列
draw(i -1, c);
break;
}
}
for(int i = 0; i < 15; i++){
for(int j = 0; j < 10; j++)
cout << s[i][j]<<" ";
cout << endl;
}
}
>>
以上就是解决这个问题的代码,我们从输入中读取了方格图和板块图案的数据,然后通过遍历的方式判断板块图案是否可以放置在方格图中,并将结果保存在新的画布s上。最后,我们输出s作为答案。
阅读全文