HDU 1226 超级密码(BFS)
2012-10-12 08:56
465 查看
题意:
思路:跟网络赛的一样,少了一个= ,昨晚纠结了一个晚上。。。
思路:跟网络赛的一样,少了一个= ,昨晚纠结了一个晚上。。。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <queue> #include <stack> using namespace std; int n,m,k; int re[29]; void init() { scanf("%d%d%d",&n,&m,&k); char ch[3]; for(int i=0;i<k;i++) { scanf("%s",ch); if(ch[0]<='9'&&ch[0]>='0') re[i]=ch[0]-'0'; else re[i]=ch[0]-'A'+10; } sort(re,re+k); } int pre[5009]; int v[5009]; int ans[5009],cnt; queue<int> que; void find(int k) { if(pre[k]!=-1) find(pre[k]); ans[cnt++] = v[k]; } void solve() { if(n==0){ if(re[0]!=0) printf("give me the bomb please\n"); else printf("0\n"); return ; } memset(v,-1,sizeof(v)); while(!que.empty()) que.pop(); for(int i=0;i<k;i++) { if(re[i]){ que.push(re[i]%n); if(v[re[i]%n]==-1) pre[re[i]%n]=-1,v[re[i]%n] = re[i]; } } while(!que.empty()) { int e = que.front(); que.pop(); if(e==0) break ; for(int i=0;i<k;i++) { int t = (e*m+re[i])%n; if(v[t]!=-1) continue; pre[t] = e; v[t] = re[i]; que.push(t); } } if(v[0]==-1){ printf("give me the bomb please\n"); return ; } cnt = 0; find(0); if(cnt>500){ printf("give me the bomb please\n"); return ; } for(int i=0;i<cnt;i++){ if(ans[i]<=9) printf("%d",ans[i]); else printf("%c",ans[i]-10+'A'); }printf("\n"); } int main() { freopen("in.txt","r",stdin); int cas; scanf("%d",&cas); while(cas--) { init(); solve(); } return 0; }
相关文章推荐
- HDU 1226超级密码(数位BFS)
- HDU 1226 超级密码(BFS) (还需研究)
- hdu 1226 超级密码bfs
- hdu 1226 超级密码(BFS,同余剪枝)
- BFS-hdu-1226-超级密码
- BFS-hdu-1226-超级密码
- HDU 1226 超级密码(BFS)
- hdu 1226 超级密码 数位bfs(我称之为
- hdu 1226 超级密码【BFS】
- HDU1226 BFS
- Hdu-1226-超级密码 [bfs]
- hdu 1226 BFS + bfs记录路径
- hdu 1226(bfs)
- HDU 1226 超级密码
- hdu 1226 超级密码 bfs
- hdu 1226 超级密码(bfs+余数判重)
- HDU 1226 BFS
- hdu - 1226 超级密码 (bfs)
- hdu 1226(bfs)
- HDU 1226 BFS