ccf 201604_2 俄罗斯方块
我的解题思路是一行行的检测是否发生碰撞,直到有一个碰撞发生或者检测无碰撞发生,若有碰撞发生就记录下发生碰撞的行n,那么n的上一行就是版块不会发生碰撞的地方。代码如下:
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
int a[15][10],b[4][4];
ifstream fin("1.txt",ios::in);//设置了文件输入,方便些
int i,j,k;
for(i=0;i<15;i++)
{
for(j=0;j<10;j++)
{
fin>>a[i][j];
//cin>>a[i][j];
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
fin>>b[i][j];
//cin>>b[i][j];
}
}
/*print
for(i=0;i<15;i++)
{
for(j=0;j<10;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}*/
int p=0,q=0;//版块下边缘 全为0的行数
for(i=3;i>=0;i--)
{
p=0;
for(j=0;j<4;j++)
{
if(b[i][j]==0) ++p;
}
if(p==4) ++q;
else break;
}
int n,m,r,s,col=0;
cin>>m;
m=m-1;
for(n=4;n<=11+q;n++)//检测碰撞
{//cout<<n<<":"<<endl;
for(i=n,r=0;i<n+4&&r<4;i++,r++)
{
for(j=m,s=0;j<m+4&&s<4;j++,s++)
{
//cout<<a[i][j]<<b[r][s]<<" ";
if(a[i][j]+b[r][s]==2)
{
col=1;
//cout<<"在 "<<i<<" 行 "<<j<<" 列发生碰撞"<<endl;
break;
}
}
cout<<endl;
if(col==1) break;
}
if(col==1) break;
}
int row;
if(col==1)
{
row=n-1;//若发生碰撞,则安全的行数
for(i=row,r=0;i<row+4&&r<4;i++,r++)
{
for(j=m,s=0;j<m+4&&s<4;j++,s++)
{
a[i][j]+=b[r][s];
}
}
}
else
{//cout<<"没碰撞"<<endl;
row=11+q;
for(i=row,r=0;i<row+4-q&&r<4;i++,r++)//版块安全下落到标准版边缘
{
for(j=m,s=0;j<m+4&&s<4;j++,s++)
{
a[i][j]+=b[r][s];
}
}
}
for(i=0;i<15;i++)//输出,,,结果正确,但提交显示错误
{
for(j=0;j<10;j++)
{
cout<<a[i][j];
}
cout<<endl;
}
return 0;
}
PS:我尝试了从1-7行下落,运行结果显示正确,但在网上提交显示报错。。求各位指教