萌新刚学OI,求帮忙看看为什么50pts
查看原帖
萌新刚学OI,求帮忙看看为什么50pts
39863
引领天下魔酸楼主2021/10/13 20:14
#include <bits/stdc++.h>
using namespace std;
using m=int[6][8];
bool flag;
vector<tuple<int,int,int>>ans;
int a[6][8],n;
bool check(m a){
    bool k=1;
    for(int i=1;i<=5&&k;i++)k&=!a[i][1];
    return k;
}
void clean(m a){
    bool k=1;
    while(k){
        k=0;bool b[6][8]={};
        for(int i=1;i<=5;i++)
        for(int j=1;j<=7;j++)if(a[i][j]){
            int lx=i,rx=i,ly=j,ry=j;
            while(lx-1>=1&&a[lx-1][j]==a[lx][j])lx--;
            while(rx+1<=5&&a[rx+1][j]==a[rx][j])rx++;
            while(ly-1>=1&&a[i][ly-1]==a[i][ly])ly--;
            while(ry+1<=7&&a[i][ry+1]==a[i][ry])ry++;
            if(rx-lx+1>=3)for(;lx<=rx;lx++)b[lx][j]=1,k=1;
            if(ry-ly+1>=3)for(;ly<=ry;ly++)b[i][ly]=1,k=1;
        }
        for(int i=1;i<=5;i++)
        for(int j=1;j<=7;j++)if(b[i][j])a[i][j]=0;
        for(int i=1;i<=5;i++)
        for(int j=1;j<=7;j++)if(!a[i][j]){
            int t=j;
            while(t<=7&&!a[i][t])t++;
            if(t>7)break;
            for(int l=j;l+t-j<=7;l++)a[i][l]=a[i][l+t-j];
            for(int l=8+j-t;l<=7;l++)a[i][l]=0;
        }
    }
}
void dfs(int now,m a){
    if(now==n){
        if(check(a)){
            for(auto [a,b,c]:ans)printf("%d %d %d\n",a-1,b-1,c);
            exit(0);
        }
        return;
    }
    m t;memcpy(t,a,sizeof(int)*6*8);
    for(int i=1;i<=4;i++)
    for(int j=1;j<=7;j++)if(a[i][j]&&a[i][j]^a[i+1][j])swap(a[i][j],a[i+1][j]),clean(a),ans.emplace_back(i,j,1),dfs(now+1,a),memcpy(a,t,sizeof(int)*6*8),ans.pop_back();
    for(int i=2;i<=5;i++)
    for(int j=1;j<=7;j++)if(a[i][j]&&!a[i-1][j])swap(a[i][j],a[i-1][j]),clean(a),ans.emplace_back(i,j,-1),dfs(now+1,a),memcpy(a,t,sizeof(int)*6*8),ans.pop_back();
}
int main(){
    #ifndef ONLINE_JUDGE
        #define FILE_OUTPUT
        #ifdef FILE_OUTPUT
        freopen("P1312.in","r",stdin);
        freopen("P1312.out","w",stdout);
        #endif
        long long c1=clock();
    #endif
    scanf("%d",&n);
    for(int i=1;i<=5;i++){
        int k;
        for(int j=1;j<=7;j++){
            scanf("%d",&k);
            if(!k)break;
            a[i][j]=k;
        }
    }
    // clean(a);
    dfs(0,a);
    puts("-1");
    #ifndef ONLINE_JUDGE
        //#define DEBUG
        #ifdef DEBUG
            freopen("CON","w",stdout);
        #endif
        puts("\n--------------------------------");
        printf("Process exited after %g seconds with return value 0\n",(clock()-c1)/1000.0);
        #ifdef DEBUG
            system("pause");
        #endif
    #endif
    return 0;
}
2021/10/13 20:14
加载中...