HDU 1226 超级密码 (搜素)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1226
题意简单,本来是一道很简单的搜素题目。
但是有两个bug:
1、M个整数可能有重复的。
2、N可能为0。
你说这两个bug有意思么,特别是第二个,真没意思。
AC代码::
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <cmath> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> #include <ctime> #pragma comment(linker, "/STACK:16777216") using namespace std; typedef __int64 LL; const int N=5005; const int M=555555; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const double eps=1e-7; int n,c,m; int h[27]; bool vis[N]; struct xh { int left,step; string s; }w,e; int char_int(char k) { if(k<='9') return k-'0'; return k-'A'+10; } char int_char(int k) { if(k<=9) return k+'0'; return k-10+'A'; } void BFS() { int i,t; memset(vis,0,sizeof(vis)); queue<xh>q; for(i=0;i<m;i++) { if(h[i]==0) continue; w.left=h[i]%n; w.s=""; w.s+=int_char(h[i]); w.step=1; if(w.left==0) { cout<<w.s<<endl; return ; } if(!vis[w.left]) { q.push(w); vis[w.left]=1; } } while(!q.empty()) { e=q.front(); q.pop(); if(e.step>=500) continue; for(i=0;i<m;i++) { w=e; w.left=(w.left*c+h[i])%n; if(vis[w.left]) continue; vis[w.left]=1; w.step++; w.s+=int_char(h[i]); if(w.left==0) { cout<<w.s<<endl; return ; } q.push(w); } } puts("give me the bomb please"); } int main() { int T; cin>>T; while(T--) { scanf("%d%d",&n,&c); scanf("%d",&m); int tt[20]; memset(tt,0,sizeof(tt)); for(int i=0;i<m;i++) { char k; cin>>k; int p=char_int(k); tt[p]=1; } m=0; for(int i=0;i<16;i++) if(tt[i]) h[m++]=i; if(n==0) { if(h[0]==0) puts("0"); else puts("give me the bomb please"); continue; } BFS(); } return 0; }