题目:http://118.190.20.162/view.page?gpid=T41
涉及知识:简单模拟
解题思路:模拟方块下降过程。
#include<iostream>
#include<cstring>
using namespace std;
#define per(i,a,b) for(int i=a;i<b;i++)
#define rep(i,b,a) for(int i=b;i>=a;i--)
const int C=10;
const int R=15;
const int N=4;
int f[R+1][C];
int b[N][N];
struct Block{
int row;
int col;
}B[N];
int main(){
per(i,0,R)
per(j,0,C)
cin>>f[i][j];
per(i,0,N)
per(j,0,N)
cin>>b[i][j];
int col;
cin>>col;
per(i,0,C)
f[R][i]=1;
///统计小方块中存在小小方块行列坐标
int k=0;
rep(i,N-1,0)
per(j,0,N){
if(b[i][j]){
B[k].row=i;
B[k].col=j;
k++;
}
}
///模拟下落
int row=1;
col--;
int flag;
while(true){
flag=false;
per(i,0,N){
if(f[row+B[i].row][col+B[i].col]){
flag=true;
break;
}
}
if(flag) break;
row++;
}
row--;
///小方块复制到大方块
per(i,0,k){
f[row+B[i].row][col+B[i].col]=1;
}
per(i,0,R)
per(j,0,C){
cout<<f[i][j];
if(j!=C-1)cout<<" ";
else cout<<endl;
}
return 0;
}
这是我第二次写的(100分),以下是我第一次写的70分,思路错了(想的太复杂),读者不必看,贴在这就仅做个记录。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int b[16][11];
int t[4][4];
int n;
int main(){
for(int i=0;i<15;i++){
for(int j=0;j<10;j++){
cin>>b[i][j];
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
cin>>t[i][j];
}
}
cin>>n;
int row,col;
int r[4],c[4],i=0;
int tr[4],tc[4];
for(col=n-1;col<n+3;i++,col++){
for(row=0;row<15;row++){
if(b[row][col]) break;
}
r[i]=row,c[i]=col;
}
for(int i=0;i<4;i++){
cout<<"("<<r[i]<<","<<"("<<c[i]<<")"<<endl;
}
cout<<"----------"<<endl;
int j=0,row1=-1;
for(col=0;col<4;j++,col++){
for(row=0;row<4;row++){
if(t[row][col]){
row1=row;
}
}
tr[j]=row1,tc[j]=col;
}
for(int i=0;i<4;i++){
cout<<"("<<tr[i]<<","<<"("<<tc[i]<<")"<<endl;
}
cout<<"----------"<<endl;
int minr=15,k,tr2=0;
for(int i=0;i<4;i++){
if(minr>=abs(tr[i]-r[i])&&tc[i]>=tr2){
minr=abs(tr[i]-r[i]);
k=i;
tr2=tc[i];
}
}
int max1=0;
for(int i=0;i<4;i++){
max1=max(max1,tr[i]);
}
int tr0=max1-tr[k];
int r0=r[k]-1+tr0;
cout<<"k="<<k<<"tr[k]="<<tr[k]<<"r[k]"<<r[k]<<" max1="<<max1<<endl;
for(int i=max1;i>=0;i--){
for(int j=0;j<4;j++){
if(t[i][j]){
b[r0][c[j]]=t[i][j];
}
}
r0--;
}
for(int i=0;i<15;i++){
for(int j=0;j<10;j++){
cout<<b[i][j];
if(j!=9)cout<<" ";
}
cout<<endl;
}
return 0;
}