【CCF-CSP】201604-2 俄罗斯方块 C++


一、题目

在这里插入图片描述

在这里插入图片描述

原题目链接

二、解题

1.题目

这段程序是一个俄罗斯方块的简化版本,以下是该程序的思路:

  1. 定义一个 20 行 10 列的数组 g,用来表示俄罗斯方块的游戏细胞地图,g 中的元素值为 1 表示该细胞为空,为 0 表示该细胞为方块。
  2. 通过输入,将前 15 行 10 列的数字读入数组 g 中,表示游戏开始时的状态。
  3. 定义一个 4 行 4 列的数组 p,用来表示下落的俄罗斯方块,p 中的元素值为 1 表示该细胞有方块,为 0 表示该细胞为空。
  4. 通过输入,将俄罗斯方块 p 的形状读入数组 p 中。
  5. 定义一个变量 c,用来表示俄罗斯方块在第几列下落,通过输入得到该值。
  6. 通过循环,将俄罗斯方块依次向下下落并检查是否能够落在 g 中,如果能够落下则将其放入 g 中(即在 g 中相应位置将元素从 1 变为 0)并退出循环。
  7. 循环结束后,输出更新后的 g 值,表示下落后的游戏状态。

2.代码

dev c++ 5.11

#include<iostream>
#include<cstring>
using namespace std;
bool g[20][10];
bool p[4][4];
int main(){
	memset(g,1,sizeof(g));
	for(int i=1;i<=15;i++){
		for(int j=1;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];
		}
	}
	int c;
	cin>>c;
	for(int r=1;;r++){
		bool st=false;
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				if(p[i][j] && g[r+i][c+j]){
					st=true;
					break;
				}
			}
			if(st) break;
		}
		if(st){
			r--;
			for(int i=0;i<4;i++){
				for(int j=0;j<4;j++){
					if(p[i][j]) g[r+i][c+j]=p[i][j];
				}
			}
			break;
		}
	}
	for(int i=1;i<=15;i++){
		for(int j=1;j<=10;j++){
			cout<<g[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}


3.提交结果

在这里插入图片描述

总结

1.解释

	if(st){
			r--;
			for(int i=0;i<4;i++){
				for(int j=0;j<4;j++){
					if(p[i][j]) g[r+i][c+j]=p[i][j];
				}
			}
			break;
		}

在这段代码中,if (st)表示如果找到可以放置形状的位置,即找到g数组中的一部分与p数组重叠的位置,则将形状放在这个位置上。

在for (int r = 1; r; r++)这个循环中,r–的作用是将r的值减1,因为当前位置无法放置形状时,r已经自增1,所以通过r–可以回到上一个位置,在那个位置上尝试放置形状。如果在先前的位置上找到了可以放置形状的位置,则在该位置上放置形状并跳出循环。

通过这样的方式,循环将在可以放置形状的位置上停止。如果在所有位置上都无法放置形状,则循环将继续执行,直到达到特定条件为止。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值