俄罗斯方块
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<queue> #include<map> using namespace std; int mp[20][15]; int m[5][5]; int main() { for(int i=0;i<15;i++) for(int j=0;j<10;j++) cin>>mp[i][j]; int h = 0,flag=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { cin>>m[h][j]; //只记录有效行,即有1的行 if(m[h][j] == 1) flag = 1; } if(flag == 1) h++; //该行有效 flag = 0; } int n; cin>>n; //一直往下试探一行,看还能不能继续往下移动,不能的时候回溯一行 int k,i,j; for(k=0;k<15;k++) { for(i=k;i<k+h;i++) { for(j=n-1;j<n+3;j++) { if(mp[i][j] == 1 && m[i-k][j-n+1] == 1) //冲突 break; if(m[i-k][j-n+1] == 1 && i == 14) //到底 break; } if(mp[i][j] == 1 && m[i-k][j-n+1] == 1) break; if(m[i-k][j-n+1] == 1 && i == 14) //到底 break; } if(mp[i][j] == 1 && m[i-k][j-n+1] == 1) break; if(m[i-k][j-n+1] == 1 && i == 14) //到底 break; } if(m[i-k][j-n+1] == 1 && i == 14) k++; //到底不需要回溯 for(i=k-1;i<k+h-1;i++) for(j=n-1;j<n+3;j++) { if(m[i][j]==0 && m[i-k+1][j-n+1] == 1) { mp[i][j]=m[i-k+1][j-n+1]; } } for(int i=0;i<15;i++) { for(int j=0;j<10;j++) cout<<mp[i][j]<<" "; cout<<endl; } return 0; }