情况紧急!

P1092 [NOIP2004 提高组] 虫食算

@ emming (逃
by t162 @ 2019-02-23 10:24:28


@[垃圾一个](/space/show?uid=85933) ```cpp #include <cstdio> #include <cstring> #include <iostream> #include <stdlib.h> using namespace std; int d[30],n; char a[30],b[30],c[30],v[91]; bool used[91]; //将n个字母一依次存入d[],同时将v[]清零 void prepare() { int q=0; for(int i=n-1;i>=0;i--) { if(v[int(a[i])]!=-1) { d[++q]=a[i]; v[int(a[i])]=-1; } if(v[int(b[i])]!=-1) { d[++q]=b[i]; v[int(b[i])]=-1; } if(v[int(c[i])]!=-1) { d[++q]=c[i]; v[int(c[i])]=-1; } } } /*check()只是判断是否可能构成正解, 并不代表得出的achievement一定是正解 还需用ok()验证 */ bool ok() { int carry=0; for(int i=n-1;i>=0;i--) { int x=v[int(a[i])]+v[int(b[i])]+carry; carry=x/n,x=x%n; if(x!=v[int(c[i])]) return 0; } if(carry==1)//如最高位有进位,return return 0; return 1; } //每得到一个字母的值,便 check(),方便剪枝 bool check() { int i; for(i=n-1;i>=0;i--) { //know a,b,c if(v[int(a[i])]>-1&&v[int(b[i])]>-1&&v[int(c[i])]>-1) { int x=v[int(a[i])]+v[int(b[i])]; if(x%n!=v[int(c[i])]&&(x+1)%n!=v[int(c[i])]) return 0; } //know a,b if(v[int(a[i])]>-1&&v[int(b[i])]>-1&&v[int(c[i])]==-1) { int x=v[int(a[i])]+v[int(b[i])]; if(used[x%n]&&used[(x+1)%n]) return 0; } //know a,c if(v[int(a[i])]>-1&&v[int(c[i])]>-1&&v[int(b[i])]==-1) { int x1=(v[int(c[i])]-v[int(a[i])]+n)%n; int x2=(v[int(c[i])]-v[int(a[i])]+n-1)%n; if(used[x1]&&used[x2]) return 0; } //know c,b if(v[int(b[i])]>-1&&v[int(c[i])]>-1&&v[int(a[i])]==-1) { int x1=(v[int(c[i])]-v[int(b[i])]+n)%n; int x2=(v[int(c[i])]-v[int(b[i])]+n-1)%n; if(used[x1]&&used[x2]) return 0; } } return 1; } void print() { int i; for(i=65;i<64+n;++i) printf("%d ",v[i]); printf("%d",v[i]); exit(0);//搜到直接结束,不浪费time } //暴搜出每个字母的值 void dfs(int i) { if(i>n) { if(ok()) print(); return; } int j; for(j=n-1;j>=0;j--)//从大到小,节约time,因为高位的数一定不大 { if(used[j]) continue; v[d[i]]=j,used[j]=1; if(check()) dfs(i+1); v[d[i]]=-1; used[j]=0; } } int main () { scanf ("%d\n",&n);//过滤换行符 scanf("%s%s%s",a,b,c); prepare(); dfs(1); } ```
by resftlmuttmotw @ 2019-02-23 10:34:58


@[resftlmuttmotw](/space/show?uid=73992) 我代码哪里错了??还要特判??
by ⚡GG⚡ @ 2019-02-23 10:36:51


@[垃圾一个](/space/show?uid=85933) 我太蒟了 没看出来
by resftlmuttmotw @ 2019-02-23 10:38:25


@[resftlmuttmotw](/space/show?uid=73992) 大佬您怎么能这样说呢?
by ⚡GG⚡ @ 2019-02-23 10:39:25


@[垃圾一个](/space/show?uid=85933) 我帮您找个大佬 @[Panda_hu](/space/show?uid=41319)
by resftlmuttmotw @ 2019-02-23 10:41:07


|