ccf 201604_2 俄罗斯方块

ynynleslie 2017-03-14 05:07:51
我的解题思路是一行行的检测是否发生碰撞,直到有一个碰撞发生或者检测无碰撞发生,若有碰撞发生就记录下发生碰撞的行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行下落,运行结果显示正确,但在网上提交显示报错。。求各位指教
...全文
190 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-15
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
ynynleslie 2017-03-14
  • 打赏
  • 举报
回复
请问赵老师,边界条件是??
赵4老师 2017-03-14
  • 打赏
  • 举报
回复
边界条件 输入输出格式 ……

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧