问题描述
俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。
游戏在一个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
这道题的想法是把对应列之间,就是上下最短距离求出来,然后这个就是方块要下沉的距离
可是只有90,没检查出什么错误,绝望.jpg
希望有道友能帮我看看,感激不尽!
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int maze[16][11];
int figure[5][5];
int col;
void init()
{
for(int i = 1;i<=15;i++)
{
for(int j = 1;j<=10;j++)
{
cin>>maze[i][j];
}
}
//figure
for(int i = 1;i<=4;i++)
for(int j = 1;j<=4;j++)
{
cin>>figure[i][j];
}
cin>>col;
}
void print()
{
for(int i=1;i<=15;i++){
for(int j=1;j<=10;j++){
if(j!=10)
cout<<maze[i][j]<<' ';
else
cout<<maze[i][j]<<endl;
}
}
}
int ColDis(int j)
{
//figure
int upCol = 0;
for(int i = 4;i>=1;i--)
{
if(figure[i][j-col+1]==1)
{
upCol = i;
break;
}
}
//maze
int downCol = 16;
for(int i = 1;i<=15;i++)
{
if(maze[i][j]==1)
{
downCol = i;
break;
}
}
int result = downCol-upCol-1;
return result;
}
int main()
{
init();
int minDis = 15;
for(int i = col;i<=col+3;i++)
{
minDis = min(ColDis(i),minDis);
}
if(minDis!=15)
{
int countFlag = 0;
for(int j = col;j<=col+3&&countFlag!=4;j++)
for(int i = 4;i>=1&&countFlag!=4;i--)
{
if(figure[i][j-col+1]==1)
{
maze[i+minDis][j] = 1;
countFlag++;
}
}
}
print();
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 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 0 0 0
0 0 0 0
0 0 0 0
0
**/
!!!我知道哪里错了!!因为我只是考虑每四列的上下距离差,但是万一上面的下落方块有一列是空的,下面的原始图像又突出来,就会影响最短距离差,但是其实那一列就算落15也不会被卡住,所以要算的时候,必须看看那一列的下落方块是不是空的
上代码!!
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int maze[16][11];
int figure[5][5];
int col;
void init()
{
for(int i = 1;i<=15;i++)
{
for(int j = 1;j<=10;j++)
{
cin>>maze[i][j];
}
}
//figure
for(int i = 1;i<=4;i++)
for(int j = 1;j<=4;j++)
{
cin>>figure[i][j];
}
cin>>col;
}
void print()
{
for(int i=1;i<=15;i++){
for(int j=1;j<=10;j++){
if(j!=10)
cout<<maze[i][j]<<' ';
else
cout<<maze[i][j]<<endl;
}
}
}
int ColDis(int j)
{
//figure
int upCol = 0;
int downCol = 16;
for(int i = 4;i>=1;i--)
{
if(figure[i][j-col+1]==1)
{
upCol = i;
for(int i = 1;i<=15;i++)
{
if(maze[i][j]==1)
{
downCol = i;
break;
}
}
break;
}
}
//maze
//cout<<j<<" "<<downCol<<" "<<upCol<<endl;
int result = downCol-upCol-1;
return result;
}
int main()
{
init();
int minDis = 15;
for(int i = col;i<=col+3;i++)
{
minDis = min(ColDis(i),minDis);
}
//cout<<
for(int i = 1;i<=4;i++)
{
for(int j = 1;j<=4;j++)
{
if(figure[i][j]==1)
{
maze[i+minDis][j+col-1] = 1;
}
}
}
// for(int j = col; j<=col+3&&countFlag!=4; j++)
// {
// for(int i = 4; i>=1&&countFlag!=4; i--)
// {
// if(figure[i][j-col+1]==1)
// {
// maze[i+minDis][j] = 1;
// countFlag++;
// }
//
// }
// }
print();
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 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 1 0 0
0 1 1 0
0 0 1 0
0 0 0 0
4
**/
下面那个注释就是我错的案例,非常感谢提供这个案例的博主!