CCF 俄罗斯方块

题目

在这里插入图片描述

分析

最开始一看题就觉得好简单,一做 好难,做出来后又觉得好简单,害心情复杂。

就是不要想太多,暴力解,一旦到了a的新的一个4*4的方阵后就与b进行判断就行了
主要还是处理数据上小心点就好了
还有就要需要考虑直接落在了底端的情况
代码有详述,不多说了,应该都能看懂

AC代码

#include<bits/stdc++.h>
using namespace std;
int a[15][10];
int b[4][4];
int t;

//将b映射到a相应位置的函数
void f(int x,int sign) {
	int k=0,i=x-sign,y=4;
	if(i<0) {//考虑刚进入就被堵住之类的情况 防止超出数组范围 
		int y=4+i;
		i=0;
	}
	for(; i<x,k<y; i++,k++) {
		for(int j=t-1; j<t+3; j++) {
			if(b[k][j-t+1]==1) {
				a[i][j]=1;//赋值 
			}
		}
	}
	
	for(int i=0; i<15; i++) {//输出 
		for(int j=0; j<10; j++) {
			cout<<a[i][j]<<" ";//ccf不考虑多出来的空格  无所谓 
		}
		cout<<'\n';
	}
}



int main() {
//输入数据
	for(int i=0; i<15; i++) {
		for(int j=0; j<10; j++) {
			cin>>a[i][j];
		}
	}
	for(int i=0; i<4; i++) {
		for(int j=0; j<4; j++) {
			cin>>b[i][j];
		}
	}
	cin>>t;


	//被阻拦 没有落到底端 
	for(int i=0; i<15; i++) {
		for(int j=t-1; j<t+3; j++) {
			if(a[i][j]==1 and b[3][j-t+1]==1) {//a的第一层 与 b的最后一层相重合 
				f(i,4);//一旦重合,则就不再向下降落 进行“赋值”(将b中的1映射到a中去) 
				return 0;
			}
		}
		for(int j=t-1; j<t+3; j++) { 
			if(a[i][j]==1 and b[2][j-t+1]==1) {//a的第二层 与 b的倒数第二层相重合
				f(i,3);
				return 0;
			}
		}
		for(int j=t-1; j<t+3; j++) {
			if(a[i][j]==1 and b[1][j-t+1]==1) {//a的第三层 与 b的倒数第三层相重合 
				f(i,2);
				return 0;
			}
		}
		for(int j=t-1; j<t+3; j++) {
			if(a[i][j]==1 and b[0][j-t+1]==1) {//a的第四层 与 b的倒数第四层相重合 
				f(i,1);
				return 0;
			}
		}
	}
	
	//不被阻拦 会到达底端 
	for(int i=3;i>=0;i--){
		for(int j=0;j<4;j++){
			if(b[i][j]==1){
				f(14,i);
				return 0;
			}
			if(b[i][j]==1){
				f(14,i);
				return 0;
			}
			if(b[i][j]==1){
				f(14,i);
				return 0;
			}
			if(b[i][j]==1){
				f(14,i);
				return 0;
			}
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MORE_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值