201604-2-俄罗斯方块-CCF

题目: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;
}


 

猜你喜欢

转载自blog.csdn.net/lianghudream/article/details/83749472