luogu1312

有趣的题面

超有趣的dfs大模拟,码了巨久,卡时过了此题qaq

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,mp[10][10][10];
struct answer{int x,y,op;}re[10];
bool arr[10][10];
inline void fall(int now)
{
    int i,j,sz;
    for(i=0;i<=4;i++)
    {
        sz=0;
        for(j=0;j<=6;j++)
        {
            if(mp[now][i][j]) mp[now][i][sz++]=mp[now][i][j];
        }while(sz<8) mp[now][i][sz++]=0;
    }
}//顾名思义模拟方块掉落
inline void chag(int now)
{
    int i,j; bool bo=1;
    for(bo=1;bo;)
    {
        bo=0; fall(now);
        for(i=0;i<=4;i++)
        {
            for(j=0;j<=6;j++)
            {
                if(mp[now][i][j])
                {
                    if(i<3)
                    {
                        if(mp[now][i][j]==mp[now][i+1][j]&&mp[now][i][j]==mp[now][i+2][j])
                        {
                            bo=arr[i][j]=arr[i+1][j]=arr[i+2][j]=1;
                        }
                    }
                    if(j<5)
                    {
                        if(mp[now][i][j]==mp[now][i][j+1]&&mp[now][i][j]==mp[now][i][j+2])
                        {
                            bo=arr[i][j]=arr[i][j+1]=arr[i][j+2]=1;
                        }
                    }
                }
            }
        }
        for(i=0;i<=4;i++)
        {
            for(j=0;j<=6;j++)
            {
                if(arr[i][j]) arr[i][j]=mp[now][i][j]=0;
            }
        }
    }
}//找到所有连续3个的方块删去,就是这么丑qaq
inline bool dfs(int now)
{
    int i,j; for(i=0;i<=4;i++)for(j=0;j<=6;j++)mp[now][i][j]=mp[now-1][i][j]; chag(now);
    if(now==n+1)
    {
        for(i=0;i<=4;i++)if(mp[now][i][0])return false; return true;
    }
    for(i=0;i<=4;i++)
    {
        for(j=0;j<=6;j++)
        {
            if(mp[now][i][j])
            {
                if(i<4&&mp[now][i][j]!=mp[now][i+1][j])//交换相同的毫无意义
                {
                    re[now].x=i; re[now].y=j; re[now].op=1;
                    swap(mp[now][i][j],mp[now][i+1][j]);
                    if(dfs(now+1))return true;//暴力搜索
                    swap(mp[now][i][j],mp[now][i+1][j]);//回溯
                }
                if(i&&!mp[now][i-1][j])//如果上一个有的话显然是向右交换字典序更小啊
                {
                    re[now].x=i; re[now].y=j; re[now].op=-1;
                    swap(mp[now][i][j],mp[now][i-1][j]);
                    if(dfs(now+1))return true;//搜搜搜
                    swap(mp[now][i][j],mp[now][i-1][j]);
                }
            }
        }
    }return false;
}
int main()
{
    int i,j,x,bo; scanf("%d",&n); memset(arr,0,sizeof arr);
    for(i=0;i<=4;i++)
    {
        for(j=0;j<=8;j++)
        {
            scanf("%d",&x); if(!x)break; mp[0][i][j]=x;
        }
    }bo=dfs(1); if(!bo)return 0*printf("-1\n");
    for(i=1;i<=n;i++)printf("%d %d %d\n",re[i].x,re[i].y,re[i].op);
}

 

posted @ 2018-09-23 00:03  yccdu  阅读(127)  评论(0编辑  收藏  举报