noip2004虫食算--搜索

链接:https://www.luogu.org/problemnew/show/P1092

首先这题标算据说是高斯消元,但标签已经是搜索了。。。身为蒟蒻当然只会打搜索。而我的搜索又打的很翔,从右到左dfs搜过来,暴枚这一列三个数的情况,然后进位。注意枚举从大到小枚,因为第一位(最左边)不会进位,所以从右到左时从大到小会更好,不然会被卡tle一个点。。。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
int n,a1[30],a2[30],a3[30],to[30];
bool vis[30];
char s1[30],s2[30],s3[30];
void dfs(int pos,int jw)
{
    if(pos==0)
    {
        for(int i=0;i<n;i++)
            printf("%d ",to[i]);
        exit(0);	
    }
    int nw1=a1[pos],nw2=a2[pos],nw3=a3[pos],tmp,tp;
    lb:
    if(to[nw1]!=-1)
    {
        if(to[nw2]!=-1)
        {
            if(to[nw3]!=-1)
            {
                if((to[nw1]+to[nw2]+jw)%n!=to[nw3])return;
                else dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
            }
            else 
            {
                tmp=(to[nw1]+to[nw2]+jw)%n;
                if(!vis[tmp])
                {
                	to[nw3]=tmp;
                    vis[to[nw3]]=1;
                    dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                    vis[to[nw3]]=0;
                    to[nw3]=-1;
                }
            }
        }
        else 
        {
            if(to[nw3]!=-1)
            {
                tmp=to[nw3]-to[nw1]-jw;
                if(tmp<0)tmp+=n;
                if(!vis[tmp])
                {
                	to[nw2]=tmp;
                    vis[to[nw2]]=1;
                    dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                    vis[to[nw2]]=0;
                    to[nw2]=-1;
                }
            }
            else
            {
                for(int i=n-1;i>=0;i--)
                {
                    if(!vis[i])
                    {
                        to[nw2]=i,vis[i]=1;
                        tmp=(to[nw1]+to[nw2]+jw)%n;
                        if(!vis[tmp])
                        {
                        	to[nw3]=tmp;
                            vis[to[nw3]]=1;
                            dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                            vis[to[nw3]]=0;
                            to[nw3]=-1;
                        }
                        else if(nw2==nw3&&tmp==i)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                        to[nw2]=-1,vis[i]=0;
                    }
                }
            }
        }
    }
    else
    {
        if(to[nw2]!=-1){swap(nw1,nw2);goto lb;}
        else
        {
            if(to[nw3]!=-1)
            {
                for(int i=n-1;i>=0;i--)
                {
                    if(!vis[i])
                    {
                        to[nw1]=i,vis[i]=1;
                        tmp=to[nw3]-to[nw1]-jw;
                        if(tmp<0)tmp+=n;
                        if(!vis[tmp])
                        {
                            to[nw2]=tmp;
                            vis[to[nw2]]=1;
                            dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                            vis[to[nw2]]=0;
                            to[nw2]=-1;
                        }
                        else if(nw1==nw2&&i==tmp)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                        to[nw1]=-1,vis[i]=0;
                    }
                }
            }
            else
            {
                for(int i=n-1;i>=0;i--)
                {
                    if(!vis[i])
                    {
                        to[nw1]=i,vis[i]=1;
                        if(nw1==nw2)
                        {
                        	tmp=(to[nw1]+to[nw2]+jw)%n;
                        	if(!vis[tmp])
                        	{
                        		to[nw3]=tmp;
                        		vis[to[nw3]]=1;
                        		dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                        		vis[to[nw3]]=0;
                        		to[nw3]=-1;
                            }
                        }
                        else
                        {
                            for(int j=n-1;j>=0;j--)
                       		{
                            	if(!vis[j])
                           		{
                                	to[nw2]=j,vis[j]=1;
                                	tmp=(to[nw1]+to[nw2]+jw)%n;
                                	if(!vis[tmp])
                                	{
                                		to[nw3]=tmp;
                                    	vis[to[nw3]]=1;
                                    	dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                                    	vis[to[nw3]]=0;
                                    	to[nw3]=-1;
                                	}
                                	else if(nw3==nw1&&tmp==i)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                                	else if(nw3==nw2&&tmp==j)dfs(pos-1,(to[nw1]+to[nw2]+jw)/n);
                                	to[nw2]=-1,vis[j]=0;
                            	}
                        	}
                        } 
                        to[nw1]=-1,vis[i]=0;
                    }
                }
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    scanf("%s",s1+1);
    scanf("%s",s2+1);
    scanf("%s",s3+1);
    memset(to,-1,sizeof to);
    for(int i=1;i<=n;i++)
    {
        a1[i]=s1[i]-'A';
        a2[i]=s2[i]-'A';
        a3[i]=s3[i]-'A';
    }
    dfs(n,0);
}

猜你喜欢

转载自blog.csdn.net/caoyang1123/article/details/81587312