1 条题解

  • 0
    @ 2025-4-7 21:38:02

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,zm[30],c[31][5];
    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)
    {
    	//printf("%d %d\n",k,w);
    	//	for(int i=0;i<n;++i)printf("%d ",zm[i]);printf("\n");
    	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;++i)printf("%d ",zm[i]);
    	  printf("\n");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;
    	}//printf("%d %d\n",k,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;
    }
    
    

    Pascal :

    program alpha;
    var i,j,k,n:longint;
    st1,st2,st3 :string;
    a :array['A'..'Z']of longint;
    s,vis :array[0..30]of longint;
    function data(i:longint):boolean;
    var k :longint;
     begin
      for k:=i downto 1 do
      if (a[st1[k]]>-1)and(a[st2[k]]>-1)and(a[st3[k]]>-1) then
      if ((a[st1[k]]+a[st2[k]])mod n<>a[st3[k]])and
      ((a[st1[k]]+a[st2[k]]+1)mod n<>a[st3[k]]) then exit(true);
      if (a[st1[k]]>-1)and(a[st2[k]]>-1) then
      if a[st1[k]]+a[st2[k]]>n then exit(true);
      if (a[st1[k]]>-1)and(a[st2[k]]>-1)and(a[st3[k]]>-1) then
      if ((a[st1[k]]+a[st2[k]]+1)mod n=a[st3[k]])
      and(a[st1[k]]+a[st2[k]]+1>n) then exit(true);
      exit(true);
     end;
    
    procedure dfs(k,j,g:longint);
    var i,p:longint;
     begin
      if k=0 then
      if j=0 then
      begin
       for i:=1 to n-1 do
        write(a[chr(ord('A')+i-1)],' ');
        writeln(a[chr(ord('A')+n-1)]);
        halt;
      end else exit;
      if a[st1[k]]=-1 then
       begin
        if (a[st2[k]]=-1)or(a[st3[k]]=-1) then
        for i:=1 to g do
         begin
          a[st1[k]]:=s[i];
          vis[s[i]]:=g;
          s[i]:=s[g];
          vis[s[i]]:=i;
          if data(k) then dfs(k,j,g-1);
          vis[s[i]]:=g;
          s[i]:=a[st1[k]];
          vis[s[i]]:=i;
         end else
        begin
         a[st1[k]]:=a[st3[k]]-a[st2[k]]-j;
         if a[st1[k]]<0 then
          begin
           p:=1;
           a[st1[k]]:=a[st1[k]]+n;
          end else p:=0;
         i:=vis[a[st1[k]]];
         if i<=g then
          begin
           s[i]:=s[g];
           vis[a[st1[k]]]:=g;
           vis[s[i]]:=i;
           if data(k) then
           if p=1 then dfs(k-1,1,g-1) else dfs(k-1,0,g-1);
           vis[s[i]]:=g;
           vis[a[st1[k]]]:=i;
           s[i]:=a[st1[k]];
          end;
        end;
        a[st1[k]]:=-1;
        exit;
       end;
      if a[st2[k]]=-1 then
      begin
       if (a[st1[k]]=-1)or(a[st3[k]]=-1) then
       for i:=1 to g do
       begin
        a[st2[k]]:=s[i];
        vis[s[i]]:=g;
        s[i]:=s[g];
        vis[s[i]]:=i;
        if data(k) then
        dfs(k,j,g-1);
        vis[s[i]]:=g;
        s[i]:=a[st2[k]];
        vis[s[i]]:=i;
       end else
      begin
       a[st2[k]]:=a[st3[k]]-a[st1[k]]-j;
       if a[st2[k]]<0 then
       begin
        p:=1;
        a[st2[k]]:=a[st2[k]]+n;
       end else p:=0;
      i:=vis[a[st2[k]]];
      if i<=g then
       begin
        s[i]:=s[g];
        vis[a[st2[k]]]:=g;
        vis[s[i]]:=i;
        if data(k) then
        if p=1 then dfs(k-1,1,g-1) else dfs(k-1,0,g-1);
        vis[s[i]]:=g;
        vis[a[st2[k]]]:=i;
        s[i]:=a[st2[k]];
       end;
      end;
      a[st2[k]]:=-1;
      exit;
     end;
     if a[st3[k]]=-1 then
     begin
      a[st3[k]]:=(a[st1[k]]+a[st2[k]]+j)mod n;
      i:=vis[a[st3[k]]];
      if i<=g then
       begin
        s[i]:=s[g];
        vis[s[g]]:=i;
        vis[a[st3[k]]]:=g;
        if data(k) then
        dfs(k-1,(a[st1[k]]+a[st2[k]]+j)div n,g-1);
        vis[a[st3[k]]]:=i;
        vis[s[g]]:=g;
        s[i]:=a[st3[k]];
       end;
      a[st3[k]]:=-1;
     end else if a[st3[k]]=(a[st1[k]]+a[st2[k]]+j)mod n then
      dfs(k-1,(a[st1[k]]+a[st2[k]]+j)div n,g);
     end;
     begin
      readln(n);
      readln(st1);
      readln(st2);
      readln(st3);
      for i:=1 to n do a[chr(ord('A')+i-1)]:=-1;
       for i:=1 to n do
        begin
         s[i]:=n-i;
         vis[n-i]:=i;
        end;
      dfs(n,0,n);
    end.
    
    
    • 1

    信息

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