码迷,mamicode.com
首页 > 其他好文 > 详细

luoguP1312 Mayan游戏 题解(NOIP2011)

时间:2018-04-05 11:32:59      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:tps   may   ret   tin   namespace   span   ace   blog   for   

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;
}

 

luoguP1312 Mayan游戏 题解(NOIP2011)

标签:tps   may   ret   tin   namespace   span   ace   blog   for   

原文地址:https://www.cnblogs.com/cjoierljl/p/8721088.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!