201604-2-俄羅斯方塊-CCF
阿新 • • 發佈:2018-11-14
題目: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; }