思路:

先写好了几个函数。旋转,四种操作,推断能否够进行合并消除

题中有好几处要考虑的细节问题,如

自然下落究竟部时不进行合并的推断,而是当自然下落非法时才推断

假设消除一行,这一行上面的所以方块仅仅会下落一行,不存在直接下落究竟部的情况

比赛时题意没有理解好。错了这两个地方。

另一些写法上的错误。这样的左右移动的题目坐标还是要从1開始,方便很多

左右移动,假设非法要复原的时候,复原的操作要与移动操作 全然相反。而且这个范围要从0開始,由于移动的时候可能移动到非法的位置。

赛后看了标程,各种优美简洁的代码。模拟能力还有待加强。



#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#define pb push_back
#define debug puts("=====================");
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
int t;
int Map[20][20]; //记录总体
int updata[20][20]; //记录当前掉落方块
char ch[1111];
int a[1111];
int n;
int chong() //推断是否有非法操作
{
int sum = 0;
for(int i=1; i<=12; i++)
for(int j=1; j<=9; j++)
if(updata[i][j]) sum++;
if(sum!=4)
return 0;
for(int i=1; i<=12; i++)
for(int j=1; j<=9; j++)
if(updata[i][j]+Map[i][j]>1)
return 0;
return 1;
}
int zhuan(int type,int x,int y) //旋转
{
if(type==1)
{
swap(updata[x-1][y],updata[x][y+1]);
swap(updata[x-2][y],updata[x][y+2]);
swap(updata[x-3][y],updata[x][y+3]);
if(!chong()) //假设非法,再转回来
{
swap(updata[x-1][y],updata[x][y+1]);
swap(updata[x-2][y],updata[x][y+2]);
swap(updata[x-3][y],updata[x][y+3]);
}
}
else if(type==2)
{
if(updata[x][y]==0) ///3->4
{
swap(updata[x-1][y],updata[x-2][y+1]);
swap(updata[x-1][y+2],updata[x][y+1]);
swap(updata[x][y+2],updata[x][y]);
if(!chong())
{
swap(updata[x-1][y],updata[x-2][y+1]);
swap(updata[x-1][y+2],updata[x][y+1]);
swap(updata[x][y+2],updata[x][y]);
}
}
else
{
if(updata[x-1][y]&&updata[x][y+1]) ///1->2
{
swap(updata[x][y+1],updata[x-2][y]);
swap(updata[x][y+2],updata[x-2][y+1]);
if(!chong())
{
swap(updata[x][y+1],updata[x-2][y]);
swap(updata[x][y+2],updata[x-2][y+1]);
}
}
else if(updata[x-1][y]&&!updata[x][y+1]) ///2->3
{
swap(updata[x][y],updata[x-1][y+1]);
swap(updata[x-2][y],updata[x-1][y+2]);
swap(updata[x-2][y+1],updata[x][y+2]);
if(!chong())
{
swap(updata[x][y],updata[x-1][y+1]);
swap(updata[x-2][y],updata[x-1][y+2]);
swap(updata[x-2][y+1],updata[x][y+2]);
}
}
else if(!updata[x-1][y]&&updata[x][y+1]) ///4->1
{
swap(updata[x-1][y+1],updata[x-1][y]);
swap(updata[x-2][y+1],updata[x][y+2]);
if(!chong())
{
swap(updata[x-1][y+1],updata[x-1][y]);
swap(updata[x-2][y+1],updata[x][y+2]);
}
}
}
}
}
int ctrl(char lei,int type) //控制上下左右
{
if(lei=='w')
{
if(type==0)
return 0;
int xx,yy;
xx = -9999;
yy = 9999;
for(int i=1; i<=12; i++)
for(int j=1; j<=9; j++)
if(updata[i][j])
xx = max(xx,i),yy = min(yy,j); //找到绿色的点,以这个点为基准
zhuan(type,xx,yy);
}
else if(lei=='a')
{
for(int i=1; i<=12; i++)
for(int j=0; j<=10; j++)
if(updata[i][j]) swap(updata[i][j],updata[i][j-1]);
if(!chong()) //假设非法,再移回来
{
for(int i=1; i<=12; i++)
for(int j=10; j>=0; j--)
if(updata[i][j]) swap(updata[i][j],updata[i][j+1]);
}
}
else if(lei=='d')
{
for(int i=1; i<=12; i++)
for(int j=10; j>=0; j--)
if(updata[i][j]) swap(updata[i][j],updata[i][j+1]);
if(!chong())
{
for(int i=1; i<=12; i++)
for(int j=0; j<=10; j++)
if(updata[i][j]) swap(updata[i][j],updata[i][j-1]);
}
}
else if(lei=='s')
{ for(int i=13; i>=1; i--)
for(int j=1; j<=9; j++)
if(updata[i][j]) swap(updata[i][j],updata[i+1][j]);
if(!chong())
{
for(int i=1; i<=13; i++)
for(int j=1; j<=9; j++)
if(updata[i][j]) swap(updata[i][j],updata[i-1][j]);
}
}
return 1;
}
int score,tmp,jj,len;
int di() //推断能否够合并、消除
{
int go = 1;
for(int i=1; i<=11; i++)
for(int j=1; j<=9; j++)
{
if(updata[i][j]&&updata[i+1][j]==0)
{
if(Map[i+1][j])
go = 0;
}
}
for(int j=1; j<=9; j++)
{
if(updata[12][j])
go = 0;
}
if(go)
return 0;
for(int i=1; i<=12; i++)
for(int j=1; j<=9; j++)
{
if(updata[i][j])
Map[i][j] = updata[i][j];
}
while(1)
{
int flag = 0;
int hang = 12;
for(int i=1; i<=12; i++)
{
int sum = 0;
if(Map[i][1])
{
for(int j=1; j<=9; j++)
sum+=Map[i][j];
}
if(sum==9)
{
// cout<<"--------\n";
hang = i;
flag = 1;
score++;
for(int j=1; j<=9; j++)
Map[i][j] = 0;
break;
}
}
if(flag)
{
for(int i=hang-1; i>=1; i--)
for(int j=1; j<=9; j++)
if(Map[i][j]&&Map[i+1][j]==0)
swap(Map[i][j],Map[i+1][j]);
}
else
break;
}
return 1;
} int main()
{
// freopen( "3.out","w",stdout );
cin>>t;
int cs = 1;
while(t--)
{
score = 0;
scanf("%d%s",&n,ch);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
memset(Map,0,sizeof(Map));
memset(updata,0,sizeof(updata));
jj = 0;
len=strlen(ch);
for(int i=0; i<n; i++) //下落的方块
{
tmp = a[i];
memset(updata,0,sizeof(updata));
if(a[i]==0)
{
updata[4][4] = 1;
updata[3][4] = 1;
updata[4][5] = 1;
updata[3][5] = 1;
}
else if(a[i]==1)
{
updata[4][4] = 1;
updata[3][4] = 1;
updata[2][4] = 1;
updata[1][4] = 1;
}
else if(a[i]==2)
{
updata[4][4] = 1;
updata[3][4] = 1;
updata[4][5] = 1;
updata[4][6] = 1;
}
for( ; jj<len; jj++) //操作编号
{
if(ch[jj]!='p')
ctrl(ch[jj],tmp);
if(di()) //推断是否进行合并,消除
{
jj++;
break;
}
ctrl('s',tmp); //每次自然下落
}
}
printf("Case %d: %d\n",cs++,score);
}
return 0;
}



HDU5374 Tetris (2015年多校比赛第7场)大模拟的更多相关文章

  1. HDU 5374 Tetris (2015年多校比赛第7场)

    1.题目描写叙述:点击打开链接 2.解题思路:本题要求模拟俄罗斯方块游戏.然而比赛时候写了好久还是没过. 后来补题发现原来是第四步的逻辑实现写错了... 题目中要求假设一整行能够消除,那么仍然运行该步 ...

  2. HDU 5411 CRB and Puzzle (2015年多校比赛第10场)

    1.题目描写叙述:pid=5411">点击打开链接 2.解题思路:本题实际是是已知一张无向图.问长度小于等于m的路径一共同拥有多少条. 能够通过建立转移矩阵利用矩阵高速幂解决.当中,转 ...

  3. HDU 5399 Too Simple (2015年多校比赛第9场)

    1.题目描写叙述:点击打开链接 2.解题思路:本题分情况讨论.比赛时候真是想的太简单了.以为就是(n!)^(cnt-1). 终于无限WA. 本题有几个特殊情况须要额外推断. 首先,假设输入的时候.有某 ...

  4. HDU 5414 CRB and String (2015年多校比赛第10场)

    1.题目描写叙述:点击打开链接 2.解题思路:本题要求推断字符串s是否能通过加入若干个字符得到字符串t. 首先,能够知道,s必须是t的一个子串(注意:不是连续子串). 第二.因为插入的新字符和它前面的 ...

  5. HDU 5384 Danganronpa (2015年多校比赛第8场)

    1.题目描写叙述:点击打开链接 2.解题思路:本题利用字典树解决.本题要求查找全部的B[j]在A[i]中出现的总次数.那么我们能够建立一颗字典树,将全部的B[j]插入字典树,因为一个串的全部字串相当于 ...

  6. 2015年多校联合训练第一场OO’s Sequence(hdu5288)

    题意:给定一个长度为n的序列,规定f(l,r)是对于l,r范围内的某个数字a[i],都不能找到一个相应的j使得a[i]%a[j]=0.那么l,r内有多少个i,f(l,r)就是几. 问全部f(l,r)的 ...

  7. 2015 HDU 多校联赛 5363 Key Set

    2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...

  8. 2015 HDU 多校联赛 5317 RGCDQ 筛法求解

    2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...

  9. hdu5379||2015多校联合第7场1011 树形统计

    pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little sun is ...

随机推荐

  1. AtCoder - 2567 RGB Sequence

    Problem Statement There are N squares arranged in a row. The squares are numbered 1, 2, …, N, from l ...

  2. 【kd-tree】bzoj3489 A simple rmq problem

    Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]),其中 i 满足(pre ...

  3. 【树链剖分】【线段树】bzoj3626 [LNOI2014]LCA

    引用题解: http://blog.csdn.net/popoqqq/article/details/38823457 题目大意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深 ...

  4. 3.4常用类(java学习笔记)Math和Random

    一.Math 这个类包含执行指数.对数.平方根法.三角函数等基本的数字运算. Math中还包含一些静态常量供我们调用. 如PI圆周率,E. 1.abs(),返回该数的绝对值. public class ...

  5. 1.10(java学习笔记)super关键字

    supe主要是调用父类中被重写的方法及属性. 用下列代码那说明: package cn.hcf.TestSuper; public class TestSuper { public static vo ...

  6. Linux之ps查找进程用kill终止命令

    http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html http://blog.csdn.net/andy572633/article ...

  7. 推荐10个免费的HTML编辑器

    如果你想开发一个网站,你肯定想要一个很棒的HTML编辑器,一个好的编辑器可以让代码更加整齐格式化,前端显示也会更好,从而提升你的工作效率.下面就为开发者推荐10个免费的HTML编辑器,你可以尝试使用. ...

  8. Centos7下ZABBIX安装全记录

    安装之前务必关闭SELINUX Install Repository with MySQL database : rpm -i https://repo.zabbix.com/zabbix/3.4/r ...

  9. 【Git】Git hangs while unpacking objects (Windows)

    Git hangs while unpacking objects (Windows) 14 Oct 2014 I'm not sure if this is because we're behind ...

  10. sqoop操作与使用

    sqoop只要安装到集群中的一台节点就可以了 1.上传sqoop到节点中 2.安装和配置 在添加sqoop到环境变量到/etc/profile中 将数据库连接驱动拷贝到$SQOOP_HOME/lib里 ...