mayan游戏

原题网上去看吧,太长了这里就不贴了╮(╯_╰)╭

这道题简直毒瘤啊啊,,,超级长的搜索。。。由于bfs空间遭不住,所以选择了dfs,然后就是十分烦人的移动、下落和清除的函数,过程繁复,下面贴出代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,a[10][10];
struct node{
    int x,y,ops;
}ans[10];
bool empty()
{
    for(int i=0;i<5;i++)
     for(int j=0;j<7;j++)
     if(a[i][j])return false;
     return true;
}
void drop()
{
    int num[10][10];
    memset(num,-1,sizeof(num));
    for(int i=0;i<5;i++)
    {
        int h=0;
        for(int j=0;j<7;j++)
        if(a[i][j])
        num[i][h++]=j;
    }
    for(int i=0;i<5;i++)
     for(int j=0;j<7;j++)
     a[i][j] = num[i][j] == -1?0:a[i][num[i][j]];
}
bool clear()
{
    bool flag=0;
    for(int x = 0; x < 3; x++)
        for(int y = 0; y < 7; y++)
        if(a[x][y])
        {
            int x2;
            for(x2 = x; x2+1<5&&a[x2+1][y]==a[x][y]; x2++);
            if(x2 - x >= 2)
            {
                int tx;
                for(tx = x; tx <= x2; tx++)
                {
                    int Up = y,Dn = y;
                    while(Up+1<7&&a[tx][Up+1] == a[x][y]) Up++;
                    while(Dn-1>=0&&a[tx][Dn-1] == a[x][y]) Dn--;
                    if(Up - Dn >= 2)
                    {
                        int ty;
                        for(ty = Dn; ty <= Up; ty++)
                            a[tx][ty] = 0;
                    }
                }
                for(tx = x; tx <= x2; tx++)
                    a[tx][y] = 0;
                flag = 1;
            }
        }
     for(int x=0;x<5;x++)
        for(int y=0;y<5;y++)
        if(a[x][y])
        {
            int y2;
            for(y2=y;y2+1<7&&a[x][y2+1]==a[x][y];y2++);
            if(y2-y>=2)
            {
                int ty;
                for(ty=y;ty<=y2;ty++)
                {
                    int Lf=x,Ri=x;
                    while(Lf-1>=0&&a[Lf-1][ty]==a[x][y])Lf--;
                    while(Ri+1<7&&a[Ri+1][ty]==a[x][y])Ri++;
                    if(Ri-Lf>=2)
                    {
                        int tx;
                        for(tx=Lf;tx<=Ri;tx++)
                            a[tx][ty]=0;
                    }
                }
                for(ty = y; ty <= y2; ty++)
                    a[x][ty] = 0;
                flag = 1;
            }
        }
    if(flag) return true;
    else return false;
}
void dfs(int step)
{
    if(step>n)
    {
        if(empty())
        {
            for(int i=1;i<=n;i++)
            {
                if(ans[i].ops)
                cout<<ans[i].x+1<<‘ ‘<<ans[i].y<<‘ ‘<<-1<<endl;
                else
                cout<<ans[i].x<<‘ ‘<<ans[i].y<<‘ ‘<<1<<endl;
            }
            exit(0);
        }
        return ;
    }
    int sum[15];
    memset(sum,0,sizeof(sum));
    for(int i=0;i<5;i++)
     for(int j=0;j<7;j++)
     sum[a[i][j]]++;
    for(int i=1;i<=10;i++)
    if(sum[i]!=0&&sum[i]<3) return ;
    for(int i=0;i<4;i++)
     for(int j=0;j<7;j++)
     if(a[i][j]!=a[i+1][j])
     {
         ans[step].x=i;
         ans[step].y=j;
         ans[step].ops=(!a[i][j]);
         int temp[10][10];
         memcpy(temp,a,sizeof(temp));
         swap(a[i][j],a[i+1][j]);
         drop();
         while(clear())drop();
         dfs(step+1);
         ans[step].x=0;
         ans[step].y=0;
         ans[step].ops=0;
         memcpy(a,temp,sizeof(a));
     }
}
int main()
{
    freopen("mayan.in","r",stdin);
    freopen("mayan.out","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<5;i++)
    {
        for(int j=0;;j++)
        {
            scanf("%d",&a[i][j]);
            if(a[i][j]==0) break;
        }
    }
    dfs(1);
    cout<<-1;
    return 0;
}

调试了一个多小时的clear函数,整个人都瘫了%>_<%

清清正正射命丸文是也~

时间: 2024-08-01 17:09:31

mayan游戏的相关文章

【noip2011】【codevs1136】Mayan游戏

3.Mayan 游戏(mayan.cpp/c/pas)[问题描述]Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:1.每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7):如果

洛谷P1312 [NOIOP2011提高组 Day1T3]Mayan游戏

Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将 交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那么被拖动的

noip提高组2011 Mayan游戏

Mayan游戏 描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关是指在规定的步数内消除所有的方块,**消除方块的规则如下: 1.每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见图6到图7):如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从

洛谷 P1312 Mayan游戏

P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那

$Mayan$游戏

\(Mayan\)游戏 好啊,一年(半年)来的梦魇,终于结束了. 其实我从来没料到整体竟然会如此暴力--做的时候机房里冷得很,感觉晕晕乎乎地做完了,晕晕乎乎地调了好久,晕晕乎乎地听(看了题解的)\(qcr\)给我讲怎么优化代码量,怎么剪枝. 每次搜索要保留本次的状态,这是比较好想的,我也成功的想到了.但是问题是我们不能单纯地用一个二维数组来\(copy\),需要记录步数,不然就会错误\(copy\_back\).于是最终我们需要一个三维数组来记录.后半段是\(qcr\)告诉我的. 大概就是--我

P1312 Mayan游戏 [模拟][搜索]

P1312 Mayan游戏 这道题跟斗地主都是大模拟啊!稍微挂一点可能就爆零了! 图肯定能存,直接二维数组扔进去即可. 然后套dfs模板,搜索就先照那样搜. 核心操作有两个:一个是判断那些块可以消掉,一个是把那些可以消的消了. 第一个操作的核心代码是这样的: for(int i = 1; i <= 5; i++) { for(int j = 1; j <= 7; j++) { if(G[i][j] && i - 1 >= 1 && i + 1 <=

[题解]Mayan游戏

Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1.每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见图6到图7):如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参

NOIp2011 mayan游戏

传送门 题目描述 Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个 7行 5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1.  每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交 换位置(参见输入输出样例说明中的图 6 到图 7):如果目标位置上没有方块,那么被拖动的方

NOIP2011tg mayan游戏(搜索)

题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那么被拖动的方块将从原来的竖列

NOIP Mayan游戏

描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1.每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见图6到图7):如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬