WA & TLE 30pts 求调
查看原帖
WA & TLE 30pts 求调
356003
Moeebius楼主2022/2/7 16:05

WA 1个点 TLE 6个点 QwQ

/*
* @ Author: Xiaohuba
* @ Usage: Luogu Problem
* @ Language: C++
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define pii pair<int,int>
#define mkp make_pair
#define vi vector<int>
#define vs vector<string>
#define viit vector<int>::iterator
#define il inline
#define Endl putchar('\n')
#define Space putchar(' ')
template <typename T>
il void read(T & tmp){ tmp=0;char c=getchar();bool flg=0;while(!isdigit(c)) flg=c=='-',c=getchar();while(isdigit(c)) tmp=(tmp<<3)+(tmp<<1)+c-'0',c=getchar();if(flg) tmp*=-1; }
template <typename T, typename... Args>
il void read(T &tmp, Args &...tmps){ read(tmp);read(tmps...); }
template <typename T>
il void __write(const T &x){ if(x==0) return;__write(x/10);putchar(x%10+'0'); }
template <typename T>
il void write(const T &x){ if(x==0) putchar('0');if(x<0) putchar('-');__write((x<0 ? -x : x)); }
template <typename T>
il void write_with_space(T &x){ write(x);Space; }
template <typename T>
il void write_with_endl(const T &x){ write(x);Endl; }
template <typename T, typename... Args>
il void write(const T &x, const Args &...y){ write_with_space(x);write_with_space(y...); }
il void __getline(istream & istr, string & str){ getline(istr,str);if(*(str.end()-1)=='\r') str.erase(str.end()-1); }
#define getline __getline
#define For(x,st,ed) for(register int x=st,END=ed;x<=END;++x)
#define ForDown(x,st,ed) for(register int x=st,END=ed;x>=END;--x)
#define sq(x) (x*x)
#define Set(a,b) memset(a,b,sizeof(a))
#define Cpy(a,b) memcpy(a,b,sizeof(a))
/* ---File Head--- */
#define tr(i,j) ((i-1)*5+j)
struct point//存状态的结构体
{
    int a[36];//格子,压成了一位数组
    int step;//步数
    int cnt;//方块数量
    bool change[36];//需要改变的位置
    int sum[11];//每种颜色的数量
    il bool fall()//掉落
    {
        bool flg=0;
        For(j,1,5)
        For(i,1,6)
        {
            if(!a[tr(i,j)]&&a[tr(i+1,j)])
            {
                flg=1;
                int idx=i;
                while(!a[tr(idx,j)] && idx) idx--;
                idx++;
                For(k,i+1,7) a[tr(idx+k-i-1,j)]=a[tr(k,j)];
            }
        }
        return flg;
    }
    il bool check()//记录消除
    {
        memset(change,0,sizeof(change));
        bool flg=0;
        For(i,1,7)
        For(j,1,5)
        {
            if(!a[tr(i,j)]) continue;
            int idx1=i,idx2=j;
            For(k,i+1,7){
                if(a[tr(k,j)]==a[tr(i,j)]) idx1++;
                else break;
            }
            For(k,j+1,5)
            {
                if(a[tr(i,k)]==a[tr(i,j)]) idx2++;
                else break;
            }
            if(idx1-i+1>=3){
                For(k,i,idx1)
                    change[tr(k,j)]=1,flg=1;
            }
            if(idx2-j+1>=3){
                For(k,j,idx2)
                    change[tr(i,k)]=1,flg=1;
            }
        }
        return flg;
    }
    il void doit()//消除
    {
        For(i,1,7)
        For(j,1,5)
        if(change[tr(i,j)])
            sum[a[tr(i,j)]]--,a[tr(i,j)]=0,cnt--;
    }
    il void trans(int x, int y, int op)//移动
    {
        swap(a[tr(x,y)],a[tr(x,y+op)]);
        while(1)
        {
            bool flg1=fall();
            bool flg2=check();
            doit();
            if(!flg1 && !flg2) break;
        }
    }
    il bool valid()//是否合法
    {
        For(i,1,10) if(sum[i]==1 || sum[i]==2) return 0;
        return 1;
    }
}s;
int n;
struct operation//操作列表
{
    int x,y,op;
}oper[10];
il void output()//输出
{
    For(i,1,n){
        write(oper[i].x);Space;write(oper[i].y);Space;write(oper[i].op);
        Endl;
    }
}

void dfs(const point &data)//深搜函数
{
    //debug(data);
    if(!data.cnt && data.step==n)
    {
        output();
        exit(0);
    }
    if(data.step==n) return;//已经走了n步但是没有消完,没戏了
    For(i,1,7)
    For(j,1,5)
    {
        if(!data.a[tr(i,j)]) continue;
        if(j<5)
        {
            point nd=data;
            nd.step++;
            nd.trans(i,j,1);
            oper[nd.step]=(operation){j-1,i-1,1};//自己的坐标和题意不同,转换一下
            if(nd.valid()) dfs(nd);
        }
        if(!data.a[tr(i,j-1)]&&j>1)
        {
            point nd=data;
            nd.step++;
            nd.trans(i,j,-1);
            oper[nd.step]=(operation){j-1,i-1,-1};
            if(nd.valid()) dfs(nd);
        }
        oper[data.step+1]=(operation){0,0,0};
    }
}

signed main()
{
    s.cnt=0;
    read(n);
    For(i,1,5)
    {
        int x,j=0;
        while(++j)
        {
            read(x);
            if(!x) break;
            s.a[tr(j,i)]=x;
            s.cnt++;
        }
    }
    s.step=0;
    dfs(s);
    puts("-1");
    return 0;
}
2022/2/7 16:05
加载中...