zoukankan      html  css  js  c++  java
  • luoguP1312 Mayan游戏 题解(NOIP2011)

    luoguP1312 Mayan游戏 题目

    #include<bits/stdc++.h>
    #define ll long long
    #define rg register
    #define il inline
    #define inf 1<<30;
    using namespace std;
    
    int a[10][10],b[6][10][10];
    int tmp[10][10];
    int way[10][3];
    int n,ans,maxn;
    
    il ll gi() 
    {
        ll x=0,o=1;
        char ch;ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
        if(ch=='-') o=-1,ch=getchar();
        while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    il void input() 
    {
        n=gi();
        for(int i=1;i<=5;i++) 
        {
            int tmp=gi(),p=7;
            while(tmp)
                a[p--][i]=tmp,tmp=gi();
            a[8][i]=1;
        }
    }
    il void print(int a[10][10]) 
    {
        for(int i=1;i<=7;i++) 
        {
            for(int j=1;j<=5;j++)
                cout<<a[i][j];
            cout<<endl;
        }
    }
    il void drop(int y) 
    {
        int p=0;
        for(int i=7;i>=1;i--) 
        {
            if(a[i][y]!=0)
            {
                p=i+1;
                while(a[p][y]==0)
                    p++;
                if(p==i+1) continue;
                p-=1;
                a[p][y]=a[i][y];
                a[i][y]=0;
            }
        }
    }
    il int del(int i,int j,int deti,int detj) 
    {
        int fi=i,fj=j,s=1;
        while(1) 
        {
            i+=deti;j+=detj;
            if(i==0||i==8||j==0||j==6) break;
            if(tmp[i][j]!=tmp[fi][fj]) break;
            s++;
            if(s==3) break;
        }
        i=fi;j=fj;
        while(1) 
        {
            i-=deti;j-=detj;
            if(i==0||i==8||j==0||j==6) break;
            if(tmp[i][j]!=tmp[fi][fj]) break;
            s++;
            if(s==3) break;
        }
        if(s>=3)
        {
            a[fi][fj]=0;
            return 1;
        }
        return 0;
    }
    il int delet()
    {
        int flag=0;
        for(int i=7;i>=1;i--)
            for(int j=1;j<=5;j++)
                tmp[i][j]=a[i][j];
        for(int i=7;i>=1;i--)
            for(int j=1;j<=5;j++) 
            {
                if(a[i][j]==0) continue;
                if(del(i,j,1,0)) flag=1;
                if(del(i,j,0,1)) flag=1;
            }
        for(int i=1;i<=5;i++)drop(i);
        return flag;
    }
    il void move(int x,int y,int mode) 
    {
        swap(a[x][y],a[x][y+mode]);
        drop(y);
        drop(y+mode);
        while(delet());
    }
    il bool check(int b[10][10])
    {
        for(int i=7;i>=1;i--)
            for(int j=1;j<=5;j++)
            {
                if(a[i][j]!=0)
                    return 0;
            }
        return 1;
    }
    il void reset(int k) 
    {
        for(int l=1;l<=7;l++)
            for(int r=1;r<=5;r++)
                a[l][r]=b[k][l][r];
    }
    il void copy(int k) 
    {
        for(int l=1;l<=7;l++)
            for(int r=1;r<=5;r++)
                b[k+1][l][r]=a[l][r];
    }
    il void dfs(int k)
    {
        if(k>n)
        {
            if(check(b[k])) 
            {
                ans=1;
                for(int i=1;i<k;i++)
                {
                    for(int j=0;j<=2;j++)
                        cout<<way[i][j]<<' ';
                    cout<<endl;
                }
            }
            return;
        }
        if(ans) return;
        for(int j=1;j<=5;j++) 
        {
            for(int i=7;i>=1;i--)
            {
                reset(k);
                if(a[i][j]==0) continue;
                if(j!=5&&a[i][j+1]!=a[i][j])
                {
                    way[k][0]=j-1;
                    way[k][1]=7-i;
                    way[k][2]=1;
                    move(i,j,1);
                    copy(k);
                    dfs(k+1);
                }
                if(ans) return;
                reset(k);
                if(j!=1&&a[i][j-1]==0) 
                {
                    way[k][0]=j-1;
                    way[k][1]=7-i;
                    way[k][2]=-1;
                    move(i,j,-1);
                    copy(k);
                    dfs(k+1);
                }
                if(ans)    return;
            }
        }
    }
    
    int main() 
    {
        input();
        for(int i=1;i<=7;i++)
            for(int j=1;j<=5;j++)
                b[1][i][j]=a[i][j];
        dfs(1);
        if(!ans) cout<<"-1"<<endl;
        return 0;
    }




    哪怕人间是炼狱,梦想永远是天堂
    继续走下去吧,理想永远都年轻,花儿一定会再次盛开
  • 相关阅读:
    【洛谷5304】[GXOI/ZOI2019] 旅行者(二进制分组+最短路)
    【LOJ6485】LJJ 学二项式定理(单位根反演)
    【CF932E】Team Work(第二类斯特林数简单题)
    【CF960G】Bandit Blues(第一类斯特林数)
    【洛谷4689】[Ynoi2016] 这是我自己的发明(莫队)
    【洛谷5355】[Ynoi2017] 由乃的玉米田(莫队+bitset)
    【洛谷5268】[SNOI2017] 一个简单的询问(莫队)
    【洛谷4688】[Ynoi2016] 掉进兔子洞(莫队+bitset)
    【洛谷3653】小清新数学题(数论)
    【洛谷6626】[省选联考 2020 B 卷] 消息传递(点分治基础题)
  • 原文地址:https://www.cnblogs.com/cjoierljl/p/8721088.html
Copyright © 2011-2022 走看看