#include<stdio.h> int main(){ int i,n,a[21][11],j; for(i=0;i<15;i++) for(j=0;j<10;j++) scanf("%d ",&a[i][j]);//输入原始界面 struct Box{ int start=-1;//一行开始坐标 int count=0;//改行的方块数 };//表示一行的信息 Box b[5]; int temp[5][5]; int h,l,c=0; for(i=0;i<4;i++){ for(j=0;j<4;j++){ scanf("%d",&temp[i][j]); if(temp[i][j]!=0){ if(c==0) h=i; c++; if(b[i].count==0) b[i].start=j; b[i].count++; l=i; } } } int left=3; for(i=0;i<4;i++) if(b[i].start<left&&b[i].start!=-1) left=b[i].start; c=l-h+1;//算出方块所占行数 int p,flag,temp1=c,temp2=l; scanf("%d",&p);//起始位置 从0 开始 for(i=14;i>=0&&c>0;i--){//从下往上扫描 i行 flag=0; for(j=p+b[l].start-left;j<b[l].start-left+p+b[l].count;j++){ //j列 p最左边的位置 b[l].start 输入块最后一行的 下标 if(a[i][j]!=0){//容不下我 flag=1;//标记 break;//退圈 } } if(flag==0){//第i行可以容下输入块的l行 c--;//剩余行数减一 l--;//继续比较上面的 } else { c=temp1; l=temp2; } } if(c<=0){//如果原始块中有某一块地方容得下输入块 for(i=i+1;temp1>0;i++){ for(j=p+b[h].start-left;j<b[h].start-left+p+b[h].count;j++) a[i][j]=1; h++; temp1--; } } for(i=0;i<15;i++){ for(j=0;j<10;j++){ printf("%d ",a[i][j]);//输出变换后的界面 } printf("\n"); } return 0; } 得分10,明明测试能通过也不知道哪里没合他老人家的心意,挂一下。