如题

真坑呀!!!

可算过了

我率先达到了氧气富有化

先是改变时没有fall。40分

然后是fall函数写慢了 tle 50分


.


上代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int m[6][9];
bool era[6][9];
int t[15];
bool can()
{
bool ca=false;
for(int i=1;i<=5;i++)
for(int j=1;m[i][j];j++)
{
if(j-1&&m[i][j-1]==m[i][j]&&m[i][j]==m[i][j+1]&&m[i][j-1]==m[i][j+1])//暴力判断是否可以消除
{
era[i][j-1]=era[i][j]=era[i][j+1]=true;//ps 如果是多于四个方格,我们可以拆成3个方格重叠。这也就是为什么要era消除标记,而不是直接消除
ca=true;
}
if(i-1&&m[i-1][j]==m[i][j]&&m[i][j]==m[i+1][j]&&m[i-1][j]==m[i+1][j])
{
era[i-1][j]=era[i][j]=era[i+1][j]=true;//所以,这样的话,十字行就可以处理了
ca=true;
}
}
return ca;
}
void fall()
{
int pass[50],top;
for(int i=1;i<=5;i++)
{
top=0;
for(int j=1;j<=7;j++)
if(m[i][j])//先从下到上扫一遍,将有颜色的 方格储存下来。
{
pass[++top]=m[i][j];
m[i][j]=0;
}
for(int j=1;j<=top;j++)
m[i][j]=pass[j];//再安回去
}
}
void clear()
{
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
if(era[i][j])//照着标记消就可以了
{
m[i][j]=0;
t[m[i][j]]-=1;
era[i][j]=false;//顺便重置一下
}
fall();//掉落
}
bool judge1()
{
int sum=0;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
sum+=m[i][j];
return sum;//全0时结束
}
bool judge2()
{
for(int i=1;i<=10;i++)
t[i]=0;
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
t[m[i][j]]+=1;
for(int i=1;i<=10;i++)
if(t[i]>=1&&t[i]<=2)
return true;
return false;//如果一种颜色的方格的个数大于1而且小于2,那么这种颜色的方块一定就消不了了,直接退出
}
};
node a;
int n;
bool found;
int stack[5555][3];
void dfs(int step)
{
if(a.judge2())
return ;
if(found)
return ;
if(step==n)
{
if(a.judge1())
return ;
found=true;
return ;
}
node b=a;
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
{
if(a.m[i][j]!=a.m[i+1][j]&&i+1!=6&&a.m[i][j])
{
swap(a.m[i][j],a.m[i+1][j]);
a.fall();
while(a.can())
a.clear();
dfs(step+1);
a=b;
stack[step][0]=i;
stack[step][1]=j;
stack[step][2]=1;
}
if(found)
return;
if(!a.m[i-1][j]&&a.m[i][j]&&i-1!=0)
{
swap(a.m[i][j],a.m[i-1][j]);
a.fall();
while(a.can())
a.clear();
dfs(step+1);
a=b;
stack[step][0]=i;
stack[step][1]=j;
stack[step][2]=-1;
if(found)
return ;
}
}
}
int main()
{
scanf("%d",&n);
int j=1;
for(int i=1;i<=5;i++)
{
j=1;
scanf("%d",&a.m[i][j]);
a.t[a.m[i][j]]+=1;
while(a.m[i][j])
{
j+=1;
scanf("%d",&a.m[i][j]);
a.t[a.m[i][j]]+=1;
}
}
while(a.can())
a.clear();
dfs(0);
if(found)
{
for(int i=0;i<n;i++)
printf("%d %d %d\n",stack[i][0]-1,stack[i][1]-1,stack[i][2]);
return 0;
}
printf("-1");
return 0;
}

对于这道题

难点我觉得不是思维的难度

而是码力。真的时纯靠码力

以及算法的优化

fall函数我一开始就写了个n^2算法

华丽丽的tle

mayan 游戏真是毒瘤的更多相关文章

  1. Luogu P1312 Mayan游戏(搜索)

    P1312 Mayan游戏 题意 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个\(7\)行\(\times 5\)列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必 ...

  2. NOIP2011 Mayan游戏

    3 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上 ...

  3. noip提高组2011 Mayan游戏

    Mayan游戏 描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关 ...

  4. [题目] Luogu P1312 Mayan游戏

    题面 题目描述 $ Mayan puzzle $是最近流行起来的一个游戏.游戏界面是一个 \(7行 \times 5列\)的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放 ...

  5. $Mayan$游戏

    \(Mayan\)游戏 好啊,一年(半年)来的梦魇,终于结束了. 其实我从来没料到整体竟然会如此暴力--做的时候机房里冷得很,感觉晕晕乎乎地做完了,晕晕乎乎地调了好久,晕晕乎乎地听(看了题解的)\(q ...

  6. 洛谷P1312 Mayan游戏

    P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...

  7. [Luogu 1312] noip11 Mayan游戏

    [Luogu 1312] noip11 Mayan游戏 Problem: Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  8. luoguP1312 Mayan游戏 题解(NOIP2011)

    luoguP1312 Mayan游戏 题目 #include<bits/stdc++.h> #define ll long long #define rg register #define ...

  9. 洛谷P1312 [NOIP2011提高组Day1T3]Mayan游戏

    Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游 ...

随机推荐

  1. 【C】一个读取文件记录器

    分享一下!!! #include<stdio.h> #include<windows.h> #define N 70000 //定义行数!!用空间换取时间 struct stu ...

  2. Beam内置的数据源清单(Java、Python)

    不多说,直接上干货! Beam内置的Java数据源清单: Beam内置的Python数据源清单:  

  3. pat1019. General Palindromic Number (20)

    1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  4. NPOI 操作EXCEL 小计

    由于需要做一个生成下载Excel的功能,查了一下  常用的操作有 NPOI Spire DOCX,于是便下载了NPOI试了一下,发现确实好用,但是还是有几个比较坑的地方 1.不能直接删除列 虽然提供了 ...

  5. Jquery获取父元素

    jquery获取父元素 方法:parent(),parents(),closest() 栗子: <ul class="parent1"> <li><a ...

  6. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...

  7. 让DIV的滚动条自动滚动到最底部

    一个在线聊天窗口,在做最后的修饰时,需要对获得的信息即时滚动以保证用户总能看到最新消息. 我得出的结论是:在选中div时,必须用原生js,jQuery不起作用 <!DOCTYPE> < ...

  8. 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题

    转自博客http://blog.csdn.net/xd195666916/article/details/5419316,同时感谢博主 今天做了个用hibernate直接执行原生sql的查询,报错No ...

  9. C#实现屏幕指定区域截屏

    //string Opath = @"C:/Picture";            //if (Opath.Substring(Opath.Length - 1, 1) != @ ...

  10. php的yii框架开发总结8

    EMailer是一个简单的封装PHPMailer类.利用这个扩展可以实现发邮件的功能. 下载地址:http://www.yiiframework.com/extension/mailer/ 下载解压把 ...