UVA - 10396(简单暴力)
2015-04-16 13:31
417 查看
直接暴a,然后dfs可行b,求b时如果中间值超过上限则要剪枝
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <set> using namespace std; int max_[3]= {9999,999999,99999999}; int lim[3] = {2,3,4}; int st[3] = {10,100,1000}; int ed[3] = {99,999,9999}; int mi[3][10]={{0,10,1},{0,100,10,1},{0,1000,100,10,1}}; int cnt[10]; set<int> vis[3]; void inline cal(int n,int f){ int tn = n; while(tn){ cnt[tn%10]+=f; tn/=10; } } void dfs(int p,int sum,int a,int I){ if(p == lim[I]+1){ memset(cnt,0,sizeof(cnt)); int b = sum/a; cal(sum,1); cal(b,-1); cal(a,-1); for(int i=0;i<=9;i++) if(cnt[i]!=0) return ; if( !(sum&1) ){ vis[I].insert(sum); } return ; } int st=0; if(p == 1 || (p==lim[I]&&a%10==0) ) st++; for(int i=st;i<=9;i++){ if(sum+a*i*mi[I][p]<=max_[I]){ dfs(p+1,sum+a*i*mi[I][p],a,I); } } } int main() { for(int i=0;i<3;i++){ for(int j=st[i];j<ed[i];j++){ dfs(1,0,j,i); } } int n; while(scanf("%d",&n)==1&&n){ int p ; if(n==4) p=0; else if(n==6) p=1; else p = 2; for(set<int>::iterator it=vis[p].begin();it!=vis[p].end();it++){ printf("%d\n",*it); } printf("\n"); } }
相关文章推荐
- UVA 10396 - Vampire Numbers(暴力打表)
- Birthday Cake (uva10167简单暴力枚举)
- uva 10396 - Vampire Numbers(暴力)
- UVa 10396 - Vampire Numbers (暴力)
- UVA 725 Division(暴力枚举 简单)
- uva 216 - Getting in Line 简单回溯 和 暴力求解
- UVA - 10396 Vampire Numbers 暴力+打表
- 习题7-2 UVA - 225 Golygons (简单的暴力回溯法+剪枝)
- 暴力求解——UVA 572(简单的dfs)
- UVALive 4764 简单dp水题(也可以暴力求解)
- UVA 524 Prime Ring Problem (暴力预处理)
- QUTOJ 飘飘和小石(简单搜索+暴力)
- Uva 10082 POJ2538 WERTU(简单字符操作)
- UVALive 7270 Osu! Master(简单水题)
- UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)
- UVA - 11218 KTV(暴力求解)
- UVaLive 6585 && Gym 100299F Draughts (暴力+回溯)
- uva 617- Nonstop Travel(暴力+数学)
- UVA442 Matrix Chain Multiplication 矩阵运算量计算(栈的简单应用)
- UVA - 11464 Even Parity(暴力枚举)