挺有意思的
先处理下落的小方块,如果他一行全为零那么就去掉把剩下的存入vector注意他这个输入是从最上面往下输入的也就是我们最先读到的其实是最上面的。
后面是从第四行开始进行相加试探
如果相后失败那么证明小方块被堵住了,此时break,j-1即为我们最后能落到的行
#include<bits/stdc++.h>
using namespace std;
int a[16][11],b[4][4],cnt[4];
typedef struct row{
int x[4];
}row;
vector<row> q;
int main()
{
int c;
for(int i=1;i<=15;++i)
for(int j=1;j<=10;++j)
scanf("%d",&a[i][j]);
for(int i=0;i<4;++i)
for(int j=0;j<4;++j){
cin>>b[i][j];
if(b[i][j]) cnt[i]++;
}
cin>>c;
for(int i=0;i<4;++i)
{
if(cnt[i])
{
q.push_back({b[i][0],b[i][1],b[i][2],b[i][3]});//上往下,但是最头上是最后push的
}
}
int j;
for(j=4;j<=15;++j){//遍历所有行
bool flag=true;
for(int i=q.size()-1,idx=0;i>=0;--i,++idx){//遍历下落的玩意
for(int k=c;k<c+4;++k){
if(a[j-idx][k]+q[i].x[k-c]>1)flag=false;
}
}
if(!flag) break;
}
for(int i=q.size()-1,idx=0;i>=0;--i,idx++)
for(int k=c;k<c+4;++k)
a[j-1-idx][k]+=q[i].x[k-c];
for(int i=1;i<=15;++i){
for(int j=1;j<=10;++j)
cout<<a[i][j]<<' ';
cout<<endl;
}
}
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla