1 条题解

  • 0
    @ 2024-12-24 9:54:28

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,zm[30],c[5][31];
    char c1;
    bool f[30],F;
    bool jc()
    {
    	int p=0;
    	for(int i=n-1;i>=0;--i)
    	{
    	  if (zm[c[1][i]]==-1||zm[c[2][i]]==-1||zm[c[3][i]]==-1)return false;
    	  int x=zm[c[1][i]]+zm[c[2][i]]+p;
    	  if(x%n!=zm[c[3][i]])return true;
    	  p=x/n;
    	}
    	return false;
    }
    bool jc2()
    {
    	for(int i=n-1;i>=0;--i)//a+b?c
    	  if(zm[c[1][i]]!=-1&&zm[c[2][i]]!=-1&&zm[c[3][i]]!=-1)
    	  {
    		int x=(zm[c[1][i]]+zm[c[2][i]])%n;
    		if(!(x%n==zm[c[3][i]]||(x+1)%n==zm[c[3][i]]))return true;
    	  }
    	for(int i=n-1;i>=0;--i)//a+?=c
    	  if(zm[c[1][i]]!=-1&&zm[c[2][i]]==-1&&zm[c[3][i]]!=-1)
    	  {
    		int x=(zm[c[3][i]]-zm[c[1][i]]+n)%n;
    		if(f[x]&&f[(x-1)%n])return true;
    	  }
    	for(int i=n-1;i>=0;--i)//?+b=c
    	  if(zm[c[1][i]]==-1&&zm[c[2][i]]!=-1&&zm[c[3][i]]!=-1)
    	  {
    		int x=(zm[c[3][i]]-zm[c[2][i]]+n)%n;
    		if(f[x]&&f[(x-1)%n])return true;
    	  }
    	for(int i=n-1;i>=0;--i)//a+b=?
    	  if(zm[c[1][i]]!=-1&&zm[c[2][i]]!=-1&&zm[c[3][i]]==-1)
    	  {
    		int x=(zm[c[1][i]]+zm[c[2][i]])%n;
    		if(f[x]&&f[(x+1)%n])return true;
    	  }
    	return false;
    }
    void work(int k,int w)
    {
    	if(F)return;
    	if(jc())return;
    	if(jc2())return;
    	//if(zm[c[1][0]-65]+zm[c[2][0]-65]>n)return;
    	if(k==0&&w==3)
    	{
    	  for(int i=0;i<n-1;++i)printf("%d ",zm[i]);
    	  printf("%d\n",zm[n-1]);F=true;return;
    	}
    	
    	
    	if(zm[c[w][k]]!=-1)
    	{
    	  if(w==3){w=1;--k;}else ++w;
    	  work(k,w);
    	  if(w==1){w=3;++k;}else --w;
    	}
    	else
    	{
    	  for(int i=n-1;i>=0;--i)
    	    if(!f[i])
    	    {
    		  zm[c[w][k]]=i,f[i]=true;
    		  if(w==3){w=1;--k;}else ++w;
    		  work(k,w);
    		  if(w==1){w=3;++k;}else --w;
    		  zm[c[w][k]]=-1;f[i]=false;
    	    }
    	}
    	
    }
    int main()
    {
    	memset(c,0,sizeof(c));
    	scanf("%d",&n);
    	for(int i=1;i<=3;++i)
    	  for(int j=0;j<n;++j)
    	    {cin>>c1;c[i][j]=c1-65;}
    	F=false;
    	memset(f,0,sizeof(f));
    	for(int i=0;i<n;++i)zm[i]=-1;
    	work(n-1,1);
    	return 0;
    }
    
    
    • 1

    信息

    ID
    1096
    时间
    1000ms
    内存
    125MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者