90pts,TLE #9 求助,赏关
查看原帖
90pts,TLE #9 求助,赏关
865625
KobeBeanBryantCox楼主2023/7/22 09:43

rt 我真的不知道还有哪里可以剪枝了

#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
int n,ans[30];
string x[3];
bool f[3][30],used[30];
void dfs(int s,int d)
{
    if(s==(-1))
    {
        for(int i=0;i<n-1;i++)cout<<ans[i]<<" ";
        cout<<ans[n-1],exit(0);
    }
    int v[3]={x[0][s]-'A',x[1][s]-'A',x[2][s]-'A'};
    if(f[0][s]&&f[1][s]&&f[2][s])
    {
        if((ans[v[0]]+ans[v[1]]+d)%n==ans[v[2]])dfs(s-1,(ans[v[0]]+ans[v[1]]+d)/n);
        return;
    }
    for(int u=0;u<3;u++)
        if(!f[u][s])
        {
            if(ans[v[u]]!=(-1))f[u][s]=true,dfs(s,d),f[u][s]=false;
            else
            {

                if(u==0&&ans[v[1]]!=(-1)&&ans[v[2]]!=(-1))//这是剪枝
                {
                    if(used[(ans[v[2]]-ans[v[1]]-d+n)%n])return;
                    f[u][s]=true,ans[v[u]]=(ans[v[2]]-ans[v[1]]-d+n)%n,used[(ans[v[2]]-ans[v[1]]-d+n)%n]=true;
                    dfs(s,d);
                    f[u][s]=false,ans[v[u]]=(-1),used[(ans[v[2]]-ans[v[1]]-d+n)%n]=false;
                }
                else if(u==1&&ans[v[2]]!=(-1))
                {
                    if(used[(ans[v[2]]-ans[v[0]]-d+n)%n])return;
                    f[u][s]=true,ans[v[u]]=(ans[v[2]]-ans[v[0]]-d+n)%n,used[(ans[v[2]]-ans[v[0]]-d+n)%n]=true;
                    dfs(s,d);
                    f[u][s]=false,ans[v[u]]=(-1),used[(ans[v[2]]-ans[v[0]]-d+n)%n]=false;
                }
                else if(u==2)
                {
                    if(used[(ans[v[0]]+ans[v[1]]+d)%n])return;
                    f[u][s]=true,ans[v[u]]=(ans[v[0]]+ans[v[1]]+d)%n,used[(ans[v[0]]+ans[v[1]]+d)%n]=true;
                    dfs(s-1,(ans[v[0]]+ans[v[1]]+d)/n);
                    f[u][s]=false,ans[v[u]]=(-1),used[(ans[v[0]]+ans[v[1]]+d)%n]=false;
                }
                
                else for(int i=n-1;i>=0;i--)
                    if(!used[i])
                    {
                        f[u][s]=true,ans[v[u]]=i,used[i]=true;
                        dfs(s,d);
                        f[u][s]=false,ans[v[u]]=(-1),used[i]=false;
                    }
            }
            return;
        }
}
int main()
{
    cin>>n>>x[0]>>x[1]>>x[2];
    for(int i=0;i<n;i++)ans[i]=(-1);
    dfs(n-1,0);
    return 0;
}
2023/7/22 09:43
加载中...