欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

CSP认证201604-2俄罗斯方块[C++题解]:模拟、枚举

发布时间:2025/4/5 c/c++ 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 CSP认证201604-2俄罗斯方块[C++题解]:模拟、枚举 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目分析


来源:acwing

分析:

对了,刚开始的时候没看懂16 ~ 19行是啥意思?后来才知道,样例中表示的是俄罗斯方块中的L方块。 这4行仅仅表示1个方块!

0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0

怎么找到被卡住的位置?其实,从上到下开始枚举,这里需要找到第一个发生重叠的时刻,它的上一个时刻就是被卡住的位置。

复制一个新画布s,画图的时候会在那个位置++,因为只有零和一,然后当有个点s[a][b] == 2的时候,说明发生了重叠,这样我们需要返回到上一次画的位置。

这样做的话,需要考虑一种边界情况,就是直到最下面也没有发生重叠,为了处理这种情况,我们在画布的最下层加入一行 g[15][] = 1,这样就可以处理这种情况了。

ac代码

#include<bits/stdc++.h> using namespace std; const int N = 20; int n, m;int g[N][N], s[N][N]; int p[4][4];// 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;} }

题目链接

https://www.acwing.com/problem/content/3231/

总结

以上是生活随笔为你收集整理的CSP认证201604-2俄罗斯方块[C++题解]:模拟、枚举的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。