题目
分析
最开始一看题就觉得好简单,一做 好难,做出来后又觉得好简单,害心情复杂。
就是不要想太多,暴力解,一旦到了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;
}
}
}
}