第七次CCF软件能力认证B题-俄罗斯方块 题型:模拟

105 阅读1分钟

3228. 俄罗斯方块 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int g[N][N], s[N][N];  //新画布; //初始画布
int p[4][4];  //要加入的板块



bool draw(int x,int y)
{
	memcpy(s, g, sizeof s);  //把原画布复制到新画布
	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;   //新位置
				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 < 4; i ++)
        for (int j = 0; j < 4; j ++)
            cin >> p[i][j];
			
			
			
	//给底层加一层木板
	for (int i = 0; i< 10; i++)g[15][i] = 1;  //最后一层+1行全部铺上木板,方便卡落下来的板块



	int c; cin >> c; c--;  //读入的左边界是从1开始的,--让它从0开始


	//开始画
	for (int i = 0;;i++)
	{
		if (draw(i, c))   //如果当前落下来之后重叠了,那就落在上一行
		{
			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;
	}

	return 0;
}

image.png