O2优化 WA#8 90分
查看原帖
O2优化 WA#8 90分
167875
137QWQ楼主2022/8/3 17:22
#include<bits/stdc++.h>
using namespace std;
int n;
int ans[5][3],ans_num;
struct make
{
    int r[5][7];//,h[5];
}b[7];
void put(make a)
{
    /*if(a.r[0][0]==-8848) return;
    for(int i=3;i>=0;i--)
    {
        for(int j=0;j<5;j++)
            if(a.r[j][i]==-1)
                cout<<a.r[j][i]<<" ";
            else 
                cout<<" "<<a.r[j][i]<<" ";
        cout<<endl;
    }
    cout<<endl;*/
}
bool find(make a)
{
    if(a.r[0][0]==-8848) return false;
    for(int i=0;i<7;i++)
        for(int j=0;j<5;j++)
            if(a.r[j][i]!=-1)
                return false;
    return true;
}
make move2(make a)
{
    //return a;
    for(int i=0;i<5;i++)
        for(int k=0;k<3;k++)
            for(int j=1;j<7/*a.h[i]*/;j++)
                if(a.r[i][j]!=-1&&a.r[i][j-1]==-1)
                    swap(a.r[i][j],a.r[i][j-1]);
            /*else
            {
                //a.h[i]=j;
                break;
            }*/
    bool w[5][7],t=true;
    memset(w,false,sizeof(w));
    for(int i=0;i<5;i++)
        for(int j=0;j<7;j++)
            if(a.r[i][j]!=-1)
            {
                if(i<3&&a.r[i][j]==a.r[i+1][j]&&a.r[i+1][j]==a.r[i+2][j])
                    w[i][j]=true,w[i+1][j]=true,w[i+2][j]=true,t=false;
                if(j<5&&a.r[i][j]==a.r[i][j+1]&&a.r[i][j+1]==a.r[i][j+2])
                    w[i][j]=true,w[i][j+1]=true,w[i][j+2]=true,t=false;
            }
    if(t) return a;
    for(int i=0;i<5;i++)
        for(int j=0;j<7;j++)
            if(w[i][j])
                a.r[i][j]=-1;
    return move2(a);
}
make move(int x,int y,int r,make a)
{
    if(a.r[0][0]==-8848) return a;
    if(a.r[x][y]==-1||(r==1&&x==4)||(r==-1&&x==0))
    {
        a.r[0][0]=-8848;
        return a;
    }
    int y2=y,x2=(r==1?x+1:x-1);
    //if(a.r[x2][y2]==-1) a.h[x2]=y;
    swap(a.r[x][y],a.r[x2][y2]);
    return move2(a);
}
bool ask(int m)
{
    /*if(b[m].r[0][0]!=-8848)
    {
        cout<<" "<<m<<endl;
        put(b[m]);
    }*/
    if(m==n||b[m].r[0][0]==-8848) return false;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<7;j++)
        {
            ans[m][0]=i;
            ans[m][1]=j;
            ans[m][2]=1;
            ans_num=m;
            b[m+1]=move(i,j,1,b[m]);
            if(find(b[m+1])) return true;
            else if(ask(m+1)) return true;
            ans[m][2]=-1;
            b[m+1]=move(i,j,-1,b[m]);
            if(find(b[m+1])) return true;
            else if(ask(m+1)) return true;
        }
    }
    return false;
}
int main()
{
    memset(b[0].r,-1,sizeof(b[0].r));
    cin>>n;
    int num;
    for(int i=0,j;i<5;++i)
    {
        j=-1;
        while(cin>>num)
        {
            if(num==0)
            {
                //b[0].h[i]=j;
                break;
            }
            b[0].r[i][++j]=num;
        }
    }
    put(b[0]);
    if(ask(0))
        for(int i=0;i<=ans_num;i++)
            cout<<ans[i][0]<<" "<<ans[i][1]<<" "<<ans[i][2]<<endl;
    else
        cout<<-1;
}

输入

5

2 0

2 3 4 3 0

4 4 3 4 6 2 0

4 6 1 1 4 4 3 0

3 4 6 6 1 3 4 0

——————

输出(正解)

1 1 -1

2 4 1

3 2 1

3 6 1

3 3 1

——————

输出(本代码)

1 1 -1

2 4 1

3 2 1

3 3 1

3 3 1

2022/8/3 17:22
加载中...