虫食算 dfs+剪枝
来源:互联网 发布:手机短信软件哪个好 编辑:程序博客网 时间:2024/06/08 08:36
爆搜+剪枝
按加法顺序搜索,填每一个字母,然后不合法的时候return 。80分到手。
枚举的时候从n-1~0,90分。
填每一位之前,检查一遍后面所有的位数是否合法,如果后面有A+B==C—而且ABC都填过数了,但是不管进位还是不进位都不会合法的话return 。AC
#include<iostream>#include<cstdio>#include<ctime>#define LL long longusing namespace std;int n;char s1[30];char s2[30];char s3[30];int a[105];int use[105];bool vs[105];int val[105];LL tot;bool check(int x,int w){ int p3=s3[x]-'A'+1; if(use[p3]) { if(val[p3]!=(a[x]+w)%n) return false; use[p3]++; a[x]+=w; if(a[x]>=n) { a[x+1]+=a[x]/n; a[x]%=n; } return true; } else { if(vs[(a[x]+w)%n]) return false; a[x]+=w; if(a[x]>=n) { a[x+1]+=a[x]/n; a[x]%=n; } use[p3]=1; val[p3]=a[x]; return true; }}bool ans;void print(){ for(int i=1;i<=n;i++) cout<<i<<" "<<use[i]<<" "<<val[i]<<endl;}int T1,T2;bool ret(int x){ int p=s1[x]-'A'+1; int q=s2[x]-'A'+1; int p3=s3[x]-'A'+1; if(use[p]&&use[q]&&use[p3]) { int w=(val[p]+val[q])%n; if(w<val[p3]-1) return false; if(w>val[p3]&&(w!=n-1||val[p3]!=0)) return false; } return true;}void dfs(int x){ if(x>n||ans) { if(!ans) { ans=1; for(int i=1;i<=n;i++) { printf("%d",val[i]); if(i!=n) printf(" "); } } return ; } for(int i=x+1;i<=n;i++) if(!ret(i)) return; int p=s1[x]-'A'+1; int q=s2[x]-'A'+1; int p3=s3[x]-'A'+1; if(use[p]) { if(use[q]) { int w=val[p]+val[q]; if(check(x,w)) { dfs(x+1); a[x]+=a[x+1]*n; a[x]-=w; a[x+1]=0; use[p3]--; } } else { for(int i=n-1;i>=0;i--) if(!vs[i]) { vs[i]=1; use[q]++; val[q]=i; int w=val[p]+val[q]; if(check(x,w)) { dfs(x+1); a[x]+=a[x+1]*n; a[x]-=w; a[x+1]=0; use[p3]--; } vs[i]=0; use[q]--; } } } else if(use[q]) { for(int i=n-1;i>=0;i--) if(!vs[i]) { vs[i]=1; use[p]++; val[p]=i; int w=val[p]+val[q]; if(check(x,w)) { dfs(x+1); a[x]+=a[x+1]*n; a[x]-=w; a[x+1]=0; use[p3]--; } vs[i]=0; use[p]--; } } else { for(int i=n-1;i>=0;i--) { if(!vs[i]) { vs[i]=1; use[p]++; val[p]=i; if(!use[q]) for(int j=0;j<n;j++) { if(!vs[j]) { vs[j]=1; use[q]++; val[q]=j; int w=val[p]+val[q]; if(check(x,w)) { dfs(x+1); a[x]+=a[x+1]*n; a[x]-=w; a[x+1]=0; use[p3]--; } vs[j]=0; use[q]--; } } else { int w=val[p]+val[q]; if(check(x,w)) { dfs(x+1); a[x]+=a[x+1]*n; a[x]-=w; a[x+1]=0; use[p3]--; } } vs[i]=0; use[p]--; } } }}int main(){ scanf("%d",&n); scanf("%s%s%s",s1+1,s2+1,s3+1); for(int i=1;i<=n/2;i++) { swap(s1[i],s1[n-i+1]); swap(s2[i],s2[n-i+1]); swap(s3[i],s3[n-i+1]); } dfs(1); return 0;}
3 1
- 虫食算 dfs+剪枝
- 【NOIp 2004】【DFS+剪枝】虫食算
- dfs+剪枝
- DFS剪枝
- DFS+剪枝
- DFS+剪枝
- 洛谷 1064 [NOIP2004] 虫食算 dfs+剪枝
- 洛谷 1092 虫食算 (dfs+剪枝)
- DFS中的奇偶剪枝
- POJ_1011 DFS+剪枝
- poj 2192 DFS+剪枝
- DFS 剪枝 hdu 1010
- poj3009 dfs + 剪枝
- poj 2248 DFS+剪枝
- poj 1190(DFS+剪枝)
- DFS中的奇偶剪枝
- POJ 3009 DFS +剪枝
- dfs + 回溯 +剪枝
- Python函数作用域和闭包
- Java中的Copy-On-Write容器
- 关于素数的线性筛法
- Codeforces 95E-Lucky Country
- lintcode Permutation Index 排列序号
- 虫食算 dfs+剪枝
- Just do IT
- 低功耗蓝牙(BLE)
- 推荐两款很安逸的离线API文档查询工具Dash和Zeal
- 三极管讲解
- 关于CENT OS 6.7 安装ORACLE11G的问题
- Java Character类
- Android中选择控件、自动填充、GridView控件的使用
- Android 最火的快速开发框架XUtils