题目链接:
hdu5374
题意:
俄罗斯方块游戏, 给出一个玩家的操作序列(w,a,s,d,p), 和依次出现的n个方块的形状,
问最终玩家消除了几行.
解题思路:
大模拟,想清楚就好写了,
用一个数组保存 所有形状 所有状态下 四个点的相对位置
每进行一次操作时,判断是否合法(越界,重叠)
下落时判断是否重叠 ,如果重叠则不动 将方块加入地图,消行,换下一个方块继续
代码:
#include
#include
#include
using namespace std;
int dir[3][4][4][2]={
{ {0,0,0,1,1,0,1,1},{0,0,0,1,1,0,1,1},{0,0,0,1,1,0,1,1},{0,0,0,1,1,0,1,1} }, //方形
{ {0,0,0,1,0,2,0,3},{0,0,1,0,2,0,3,0},{0,0,0,1,0,2,0,3},{0,0,1,0,2,0,3,0} }, //I形
{ {0,0,0,1,1,0,2,0},{0,0,0,1,0,2,1,2},{0,1,1,1,2,1,2,0},{0,0,1,0,1,1,1,2} } //L形
};
int map[15][15];
char op[1050];
int block[1050];
int ans;
int ok(int x,int y,int b,int state) //判重叠 越界
{
int tx,ty;
for(int i=0;i<4;i++)
{
tx=x+dir[b][state][i][0];
ty=y+dir[b][state][i][1];
if(tx<1||tx>9||ty<1||ty>12||map[tx][ty]==1)
return 0;
}
return 1;
}
void change_map(int x,int y,int b,int state) //更新地图
{
int tx,ty,flag,loc;
for(int i=0;i<4;i++)
{
tx=x+dir[b][state][i][0];
ty=y+dir[b][state][i][1];
map[tx][ty]=1;
}
// for(int i=8;i>=1;i--){ //方块下落全过程...
// for(int j=1;j<=9;j++)
// printf("%d",map[j][i]);
// cout<n)
break;
}
}
printf("Case %d: %d\n",Case++,ans);
}
return 0;
}