• noip2011 玛雅游戏 大模拟


    深搜+模拟

    需要剪枝:同一移动向右移了就不需要向左移了

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int n,bo[6][8],tot,a[6][6][8],b[6][3];
    bool  boo;
    int print(int x){
        printf("
    ");
        for(int i=0;i<5;i++){
            for(int j=0;j<7;j++)
                printf("%d ",a[x][i][j]);
            printf("
    ");
        }
        printf("
    ");
        return 0;
    }
    bool boooo[5]={0};
    void fall(int step){
        for(int i=0;i<5;i++){
            int bottom=0;
            while(a[step][i][bottom]) bottom++;
            if(bottom>=7) continue;
            for(int j=bottom;j<7;j++){
                if(a[step][i][j]){
                    a[step][i][bottom++]=a[step][i][j];
                    a[step][i][j]=0;
                }
            }
        }
    }
    bool wipe(int step){
        boo=0; tot++;
        for(int i=0;i<5;i++)
            for(int j=2;j<7;j++){
                if(!a[step][i][j]) break;
                if(a[step][i][j]==a[step][i][j-1]&&a[step][i][j]==a[step][i][j-2])
                bo[i][j]=bo[i][j-1]=bo[i][j-2]=tot;
            }
        for(int i=0;i<7;i++)
            for(int j=2;j<5;j++){
                if(!a[step][j][i]) break;
                if(a[step][j][i]==a[step][j-1][i]&&a[step][j][i]==a[step][j-2][i])
                bo[j][i]=bo[j-1][i]=bo[j-2][i]=tot;
            }
        for(int i=0;i<5;i++)
            for(int j=0;j<7;j++)
                if(bo[i][j]==tot){
                    a[step][i][j]=0;
                    boo=1;
                }
        return boo;
    }
    void move(int step,int x,int y,int pos){
        swap(a[step][x][y],a[step][x+pos][y]);
        fall(step);
        while(wipe(step)==1)
            fall(step);
    }
    void dfs(int step,int x,int y,int pos){
        if(step>n) return;
        if(step!=0){
            for(int i=0;i<5;i++)
            for(int j=0;j<7;j++)
                a[step][i][j]=a[step-1][i][j];
            move(step,x,y,pos);
            b[step][0]=x;
            b[step][1]=y;
            b[step][2]=pos;
        }
        boo=0;
        bool vis[6][8]={0};
        for(int i=0;i<5;i++)
            for(int j=0;j<7;j++)
                if(a[step][i][j]){
                    boo=1;
                    if(i!=4){
                        dfs(step+1,i,j,1);
                        vis[i+1][j]=1;
                    }
                    if(i&&(!vis[i][j]))dfs(step+1,i,j,-1);
                }
        if(boo==0){
            for(int i=1;i<=step;i++)
                printf("%d %d %d
    ",b[i][0],b[i][1],b[i][2]);
            exit(0);
        }
    }
    int main()
    {
        freopen("mayan.in","r",stdin);
        freopen("mayan.out","w",stdout);
        scanf("%d",&n);
        for(int i=0;i<5;i++){
            int j=0;
            while(scanf("%d",&a[0][i][j++])==1&&a[0][i][j-1]!=0){}
        }
        dfs(0,0,0,0);
        printf("-1
    ");
        return 0;
    }


  • 相关阅读:
    FCLK、HCLK、PCLK
    CPU位数、地址线位数、数据线位数、通用寄存器位数!
    Java实现线程的三种方式和区别
    数据结构之二叉树
    List&Map&Set的操作和遍历
    从源码看Java集合之ArrayList
    Java设计模式概述
    Java实现单例的5种方式
    Java序列化
    水仙花数
  • 原文地址:https://www.cnblogs.com/Ren-Ivan/p/7746733.html
Copyright © 2020-2023  润新知