1. 程式人生 > >CCF認證201604-2 俄羅斯方塊

CCF認證201604-2 俄羅斯方塊

直接貼程式碼啦,程式碼裡有註釋
思路是這樣:先求出四列中最關鍵的一列,也就是說那一列的一個方塊決定著輸入的形狀能不能繼續往下掉,我求法是這樣,分別求出四列中原始陣列能放的最大行數減去輸入陣列中有1的行數,最小值就是關鍵部位,然後求出輸入陣列(4*4)的第一行第一列應放在哪裡

#include<iostream>
using namespace std;
int main(){
    int a[15][10];
    int b[4][4];
    int i,j,s,t;
    int c[4]={14,14,14,14},d[4]={-20,-20,-20,-20};//c[j]=i在下面用來儲存原始陣列中第j列在第i行可以填充;d[j]=i表示輸入陣列第j列第i行有1 
for(i=0;i<15;i++) for(j=0;j<10;j++) cin>>a[i][j]; for(i=0;i<4;i++) for(j=0;j<4;j++) cin>>b[i][j]; cin>>s; s=s-1;//從第s列輸入,下標從0開始 for(i=s;i<s+4;i++) for(j=0;j<15;j++){ if(a[j][i]==1){ c[i-s]=j-1; break
;//找到原始陣列第i列有1的最小行 } } for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(b[j][i]==1) d[i]=j;//找到輸入陣列中第i列有1的最大行 } } int minl=15; for(i=0;i<4;i++) if(c[i]-d[i]<minl){ minl=c[i]-d[i];//四個列相減最小值約束方塊放置位置,只需要通過這個位置求得輸入陣列第一個元素放在原始陣列的哪個位置即可
t=i; } int h=c[t],h1=d[t]; for(i=0;i<4;i++) for(j=0;j<4;j++){ if(b[i][j]==1) a[h-h1+i][s+j]=b[i][j];//輸入陣列第[0,0]個元素放在原始陣列第[h-h1,s]中 } for(i=0;i<15;i++){ for(j=0;j<10;j++){ if(j!=9) cout<<a[i][j]<<' '; else cout<<a[i][j]<<endl; } } }