hdu 5374 Tetris 模拟俄罗斯方块
2015-08-12 21:06
323 查看
题目链接:
hdu5374
题意:
俄罗斯方块游戏, 给出一个玩家的操作序列(w,a,s,d,p), 和依次出现的n个方块的形状,
问最终玩家消除了几行.
解题思路:
大模拟,想清楚就好写了,
用一个数组保存 所有形状 所有状态下 四个点的相对位置
每进行一次操作时,判断是否合法(越界,重叠)
下落时判断是否重叠 ,如果重叠则不动 将方块加入地图,消行,换下一个方块继续
代码:
hdu5374
题意:
俄罗斯方块游戏, 给出一个玩家的操作序列(w,a,s,d,p), 和依次出现的n个方块的形状,
问最终玩家消除了几行.
解题思路:
大模拟,想清楚就好写了,
用一个数组保存 所有形状 所有状态下 四个点的相对位置
每进行一次操作时,判断是否合法(越界,重叠)
下落时判断是否重叠 ,如果重叠则不动 将方块加入地图,消行,换下一个方块继续
代码:
#include<iostream> #include<cstdio> #include<cstring> 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<<endl; // } // printf("-------------\n"); while(1) { for(int i=1;i<=8;i++){ flag=1; for(int j=1;j<=9;j++) if(map[j][i]==0) { flag=0; break; } if(flag){ loc=i; break; } } if(!flag) return; ans++; for(int i=loc;i<=8;i++) for(int j=1;j<=9;j++) map[j][i]=map[j][i+1]; } } int main() { int T,n,s_x=4,s_y=9; int x,y,state,pos; int len; int Case=1; scanf("%d",&T); while(T--) { memset(map,0,sizeof(map)); pos=1,x=s_x,y=s_y,state=0; //每个方块的初始状态 ans=0; scanf("%d",&n); scanf("%s",op); len=strlen(op); for(int i=1;i<=n;i++) scanf("%d",&block[i]); for(int i=0;i<len;i++) { if(op[i]=='w'&&ok(x,y,block[pos],(state+1)%4)) state=(state+1)%4; else if(op[i]=='s'&&ok(x,y-1,block[pos],state)) y--; else if(op[i]=='a'&&ok(x-1,y,block[pos],state)) x--; else if(op[i]=='d'&&ok(x+1,y,block[pos],state)) x++; if(ok(x,y-1,block[pos],state)) y--; else { change_map(x,y,block[pos],state); x=s_x,y=s_y,state=0; pos++; if(pos>n) break; } } printf("Case %d: %d\n",Case++,ans); } return 0; }
相关文章推荐
- Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】
- [Leetcode] Combination Sum III
- Android 利用addView 动态给Activity添加View组件
- poj 1458 Common Subsequence
- 集训第五周动态规划 H题 回文串统计
- 全排列问题 解题报告
- CentOS启用iptables防火墙
- 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析
- SQL自定义函数,验证两条数据的相似度
- VC 计算参数个数宏 printf另一种格式宏
- 2015.8.2 jdbc实现商品类的增删查改
- 2015/8/12
- 序列化避免异常的一种解决思路
- 剑指offer——面试题20:顺时针打印矩阵
- shell脚本回顾01:脚本跟踪和脚本参数
- UI11_Block传值
- Linux中SVN定时备份总结
- 线性规划、梯度下降、正规方程组——斯坦福ML公开课笔记1-2
- java向上转型和向下转型
- C语言运算符优先级 之 快速记忆