思路:
1.用数组存储原来的方格和即将落下的方格; 2.从下往上搜原来的方格的底边(即最下面的、开始有1的行); 3.然后一层一层模拟下降,正在落下的方格和目前方格对应的界面上的4*4区域里,不能有重叠即可;
代码:
#include<bits/stdc++.h>
using namespace std
;
#define rp(i,n) for(int i=0;i<n;i++)
int table
[15][10];
int mat
[4][4];
int main(){
rp(i
,15) rp(j
,10) cin
>>table
[i
][j
];
rp(i
,4) rp(j
,4) cin
>>mat
[i
][j
];
int left
;
cin
>>left
;
left
--;
int but
;
for(but
=3;but
>=0;but
--){
rp(i
,4) if(mat
[but
][i
]) goto out1
;
}out1
:;
int i
;
for(i
=but
;i
<=14;i
++){
rp(j
,but
+1) rp(k
,4){
if(table
[i
-j
][left
+k
]&&mat
[but
-j
][k
]) goto out2
;
}
}out2
:i
--;
rp(j
,but
+1) rp(k
,4){
if(mat
[but
-j
][k
]) table
[i
-j
][left
+k
]=1;
}
rp(i
,15){
cout
<<table
[i
][0];
for(int j
=1;j
<10;j
++) cout
<<' '<<table
[i
][j
];
putchar('\n');
}
return 0;
}
转载请注明原文地址: https://mac.8miu.com/read-492913.html