思路:

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

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

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

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

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

另一些写法上的错误。这样的左右移动的题目坐标还是要从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. Educational Codeforces Round 10 E - Pursuit For Artifacts (强联通缩点 + 回溯)

    题目链接:http://codeforces.com/contest/652/problem/E 给你n个点m个边,x和y双向连接,要是z是1表示这条边上有宝藏,0则没有,最后给你起点和终点,问你要是 ...

  2. [BZOJ5465][APIO2018]选圆圈(KD-Tree)

    题意:给你n个圆,每次选择半径最大的,将它和与它相交的圆全部删去,输出每个圆是在哪次被删的. KD树模板题.用一个矩形框住这个圆,就可以直接剪枝了.为了防止被卡可以将点旋转一个角度,为了保险还可以多转 ...

  3. [BZOJ 1499] 瑰丽华尔兹

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 Solution : 能立即发现这是和动态规划相关的题目 令f[t][i][j]表 ...

  4. 【莫队算法】【权值分块】poj2104 K-th Number / poj2761 Feed the dogs

    先用莫队算法保证在询问之间转移的复杂度,每次转移都需要进行O(sqrt(m))次插入和删除,权值分块的插入/删除是O(1)的. 然后询问的时候用权值分块查询区间k小值,每次是O(sqrt(n))的. ...

  5. iOS数据库的基本使用

    今天总结下数据库的基本使用方法: iOS使用的数据库一般就是sqlite3,在使用该数据库前一定要先导入数据库框架,否则会出错,接下来引入头文件#import<sqlite3.h> 在工程 ...

  6. java bean对象拷贝

    Java的bean的属性复制,大家可以都看一下. 谈谈Java开发中的对象拷贝http://www.wtnull.com/view/2/e6a7a8818da742758bcd8b73d49d6be2 ...

  7. Ubuntu16.04安装Pytorch

    一.安装 1. 官方github:https://github.com/pytorch/pytorch Install optional dependencies //安装依赖项 On Linux e ...

  8. POJ 3020 Antenna Placement 最大匹配

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6445   Accepted: 3182 ...

  9. Java笔记6:多态

    一.多态的分类对象的多态性:动物 x = new 猫();函数的多态性:函数重载.重写 二.多态的体现父类的引用指向了自己的子类对象父类的引用也可以接收自己的对象 三.多态的前提必须是类与类之间只有关 ...

  10. 蓝点通用管理系统V13版发布了!

    蓝点通用管理系统13版已发布! 重磅新功能:系统的通知和提醒功能,增加微信方式,微信通知.微信查询数据.微信拍照上传....... 蓝点的客户管理系统.进销存管理系统.产品管理系统.工作流管理系统.投 ...