标签:
HDU4474,POJ1465,HDU1226,URAL1495这些题目,首先是URAL1495,那天做这个第一个想法就是数位dp,但是没有推测出来,有段时间没做这个了,呃~然后采用了dfs的手法进行记忆化搜索,结果WA出翔了,搞了一下午,而后看了题解用数位DP解决了,但是也发现了一种比较稳妥的方法,比较清晰,而且网上刚好有个巨巨整理出了这一系列做这个系列期间也没有很利索的做完,比如POJ1465,当时我的队列是开在bfs里面的,结果就一直超时,最后随意试了一下才发觉的,交了我无数把啊,另外还有一些模0的问题需要注意,HDU1226稍微加了层迷雾,不过是进制转化罢了
typedef struct Node { int num; int mod; int len; }; bool vis[15]; int n,m; int pre[10][10000 + 55][2]; queue<Node > q; int Case = 0; void init() { memset(pre,-inf,sizeof(pre)); memset(vis,false,sizeof(vis)); } bool input() { while(cin>>n>>m) { for(int i=0;i<m;i++) { int x; cin>>x; vis[x] = true; } return false; } return true; } void dfs(int pos,int mod) { if(pos == -1)return; dfs(pre[pos][mod][0],pre[pos][mod][1]); printf("%d",pos); } bool bfs() { while(!q.empty())q.pop(); Node s,e; for(int i=1;i<10;i++) { if(!vis[i]) { s.num = i; s.mod = i%n; s.len = 1; pre[i][s.mod][0] = -1; q.push(s); } } while(!q.empty()) { s = q.front(); q.pop(); if(s.mod == 0) { dfs(s.num,s.mod); return true; } for(int i=0;i<10;i++) { if(!vis[i]) { e.num = i; e.mod = (s.mod * 10 + i)%n; e.len = s.len + 1; if(pre[e.num][e.mod][0] >= -1)continue; pre[e.num][e.mod][0] = s.num; pre[e.num][e.mod][1] = s.mod; q.push(e); } } } return false; } void cal() { printf("Case %d: ",++Case); if(!bfs()){puts("-1");return;} puts(""); } void output() { } int main() { while(true) { init(); if(input())return 0; cal(); output(); } return 0; }
typedef struct Node { int num; int mod; int len; }; int nnum[100]; int n,m; int pre[10][5500 + 55][2]; queue<Node > q; void init() { memset(pre,-inf,sizeof(pre)); } bool input() { while(cin>>n>>m) { for(int i=0;i<m;i++)cin>>nnum[i]; return false; } return true; } void dfs(int pos,int mod) { if(pos == -1)return; dfs(pre[pos][mod][0],pre[pos][mod][1]); printf("%d",pos); } bool bfs() { while(!q.empty())q.pop(); Node s,e; for(int i=0;i<m;i++) { if(nnum[i]) { s.num = nnum[i]; s.mod = nnum[i]%n; s.len = 1; pre[nnum[i]][s.mod][0] = -1; q.push(s); } } while(!q.empty()) { s = q.front(); q.pop(); if(s.mod == 0) { dfs(s.num,s.mod); return true; } for(int i=0;i<m;i++) { e.num = nnum[i]; e.mod = (s.mod * 10 + nnum[i])%n; e.len = s.len + 1; if(pre[e.num][e.mod][0] >= -1)continue; pre[e.num][e.mod][0] = s.num; pre[e.num][e.mod][1] = s.mod; q.push(e); } } return false; } void cal() { if(n == 0){puts("0");return ;} sort(nnum,nnum + m); if(!bfs()){puts("0");return;} puts(""); } void output() { } int main() { while(true) { init(); if(input())return 0; cal(); output(); } return 0; }
typedef struct Node { int num; int mod; int len; }; bool vis[20 + 5]; int n,cc,m; int pre[20 + 5][5000 + 55][2]; queue<Node > q; int Case = 0; void init() { memset(pre,-inf,sizeof(pre)); memset(vis,false,sizeof(vis)); } bool input() { while(cin>>n>>cc>>m) { char s[100000 + 5]; for(int i=0;i<m;i++) { scanf("%s",s); int len = strlen(s); int tmp = 0; for(int i=0;i<len;i++) { if(s[i] >= '0' && s[i] <= '9') tmp = tmp * 10 + s[i] - '0'; else tmp = tmp * 10 + s[i] - 'A' + 10; } vis[tmp] = true; } return false; } return true; } void dfs(int pos,int mod) { if(pos == -1)return; dfs(pre[pos][mod][0],pre[pos][mod][1]); if(pos < 10)printf("%d",pos); else printf("%c",pos - 10 + 'A'); } bool bfs() { while(!q.empty())q.pop(); Node s,e; for(int i=1;i<cc;i++) { if(vis[i]) { s.num = i; s.mod = i%n; s.len = 1; pre[i][s.mod][0] = -1; q.push(s); } } while(!q.empty()) { s = q.front(); q.pop(); if(s.len > 500)return false; if(s.mod == 0) { dfs(s.num,s.mod); return true; } for(int i=0;i<cc;i++) { if(vis[i]) { e.num = i; e.mod = (s.mod * cc + i)%n; e.len = s.len + 1; if(pre[e.num][e.mod][0] >= -1)continue; //cout<<e.num<<e.mod<<"******"<<endl; pre[e.num][e.mod][0] = s.num; pre[e.num][e.mod][1] = s.mod; q.push(e); } } } return false; } void cal() { if(n == 0) { if(vis[0])puts("0"); else puts("give me the bomb please"); return ; } if(!bfs()){puts("give me the bomb please");return ;} puts(""); } void output() { } int main() { int t; cin>>t; while(t--) { init(); if(input())return 0; cal(); output(); } return 0; }
int n; typedef struct Node { int len; int digit; int mod; }; int pre[3][1000000 + 55][2]; void init() { memset(pre,-inf,sizeof(pre)); } bool input() { while(cin>>n) { return false; } return true; } void dfs(int digit,int mod) { if(digit == -1)return ; dfs(pre[digit][mod][0],pre[digit][mod][1]); printf("%d",digit); } bool bfs() { Node s,e; queue<Node> q; for(int i=1;i<=2;i++) { s.digit = i; s.mod = i%n; s.len = 1; pre[s.digit][s.mod][0] = -1; q.push(s); } while(!q.empty()) { s = q.front(); q.pop(); if(s.len > 30)return false; if(s.mod == 0) { dfs(s.digit,s.mod); return true; } for(int i=1;i<=2;i++) { e.digit = i; e.len = s.len + 1; e.mod = (s.mod * 10 + i)%n; if(pre[e.digit][e.mod][0] >= -1)continue; pre[e.digit][e.mod][0] = s.digit; pre[e.digit][e.mod][1] = s.mod; q.push(e); } } return false; } void cal() { if(n%10 == 0 || n%10 == 5) {puts("Impossible");return;} if(!bfs()){puts("Impossible");return;} puts(""); } void output() { } int main() { while(true) { init(); if(input())return 0; cal(); output(); } return 0; }
HDU4474,POJ1465,HDU1226 一类数位限制倍数的BFS问题
标签:
原文地址:http://blog.csdn.net/yitiaodacaidog/article/details/43445697