1 条题解
-
0
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
- 上传者