俄罗斯方块
问题描述
俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。
游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块。每一轮,都会有一个新的由4个小方块组成的板块从方格图的上方落下,玩家可以操作板块左右移动放到合适的位置,当板块中某一个方块的下边缘与方格图上的方块上边缘重合或者达到下边界时,板块不再移动,如果此时方格图的某一行全放满了方块,则该行被消除并得分。
在这个问题中,你需要写一个程序来模拟板块下落,你不需要处理玩家的操作,也不需要处理消行和得分。
具体的,给定一个初始的方格图,以及一个板块的形状和它下落的初始位置,你要给出最终的方格图。
输入格式
输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。
输入的第16至第19行包含新加入的板块的形状,每行包含4个数字,组成了板块图案,同样0表示没方块,1表示有方块。输入保证板块的图案中正好包含4个方块,且4个方块是连在一起的(准确的说,4个方块是四连通的,即给定的板块是俄罗斯方块的标准板块)。
第20行包含一个1到7之间的整数,表示板块图案最左边开始的时候是在方格图的哪一列中。注意,这里的板块图案指的是16至19行所输入的板块图案,如果板块图案的最左边一列全是0,则它的左边和实际所表示的板块的左边是不一致的(见样例)
输出格式
输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。
样例输入
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 0 0 0 1 1 1 1
0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
3
样例输出
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 0 0 0 0
想了一下,决定采用一个15*10的全0数组来标记落点,从下至上遍历。
用vs2019能成功运行且测试用例和自制用例都能得出正确结果,但是提交给系统却直接显示编译错误。这样的错误让我不知道到底怎么改。自己能成功运行得出正确结果且没有error和警告。代码如下,希望大佬们能指点一下错处!
#include<iostream>
using namespace std;
int mAP[16][10] = { 0 };
int map_2[16][10] = { 0 };//用来标记的数组
int rect[4][4] = { 0 };
int main()
{
for (int i = 0;i<15;i++)
{
for (int j = 0;j<10;j++)
{
cin >> mAP[i][j];
}
}
for (int i = 0;i<4;i++)
{
for (int j =0;j<4;j++)
{
cin >> rect[i][j];
}
}
int p;
cin >> p;
int row = 15;
int flag;
while (1)
{
flag = 1;
int r_row = 3;
int r_col = 0;
for (int i = row;i>0;i--)
{
for (int j = p-1;j<p+3;j++)
{
if (rect[r_row][r_col]*mAP[i][j]<=0)//没冲突,map_2赋rect对应的负值
{
map_2[i][j] = 0 - rect[r_row][r_col];
r_col++;
}
else
{
memset(map_2,0,sizeof(map_2));
row--;
flag = 0;
break;
}
}
if (flag == 0)
{
break;
}
if(r_row==0)
{
break;
}
r_row--;
r_col = 0;
}
if (flag == 1)
{
break;
}
}
for (int i = 0;i<15;i++)
{
for (int j=0;j<10;j++)
{
if (map_2[i][j]==-1)
{
cout << mAP[i][j] + 1 << " ";
}
else
{
cout << mAP[i][j] << " ";
}
}
cout << endl;
}
return 0;
}
/*
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0
1 1 1 1
1 0 0 0
0 0 0 0
4
可能代码逻辑不是很好,见谅!
*/
需要具体的报错信息。
从经验来看,很可能是缺少标头。我注意到你使用了memset,这个东西并不是定义在iostream而是在cstring下。
注:不同标准库的头文件之间的引用关系可以非常不同。你的例子中,大概是VS的iostream包含了cstring的引用(标准没有规定是否要有这样的引用关系),OJ上的则没有。包含cstring的话,应该可以解决这类问题。但由于你没有给出具体的编译报错信息,这可能不是最关键的问题;需要编译日志才能精准定位问题。
您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632