HDU1226 搜索 bfs xingxing在努力
生活随笔
收集整理的這篇文章主要介紹了
HDU1226 搜索 bfs xingxing在努力
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這道題就是給你M個C進制的數, 然后讓你求最小的數, 這個數是N的整數倍。。搜索即可:剪枝條件:假設有兩個數模N都為0那么我們就可以舍棄較大的那個數。為什么可以這樣,我們可以假設這兩個數是a, b a ?= b (mod N) ?=> a*C + d = b*C + d (mod N), 然后注意取模的時候要用大數取摸的方式。。坑點:N可能為0, 對于N==0的時候,我們應該特殊判斷, 代碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <queue>using namespace std; int N, C, M; //c進制的密碼 char num[20];struct State {char st[505];int len; }temp, res;int vis[5000 + 10]; int mod(State &st) {int tmp = 0;for(int i=0; i<st.len; i++){int num;if(st.st[i]>='0' && st.st[i]<='9') num = st.st[i] - '0';else if(st.st[i]>='A' && st.st[i]<='F') num = st.st[i]-'A'+10;tmp = (tmp*C + num)%N;}return tmp; }void print(State &u) {for(int i=0; i<u.len; i++){printf("%c", u.st[i]);}printf("\n"); }int bfs() {memset(vis, 0, sizeof(vis));queue<State> que;for(int i=0; i<M; i++){temp.len = 1;temp.st[0] = num[i];if(num[i] == '0') continue;if(!vis[mod(temp)]){que.push(temp);vis[mod(temp)] = 1;}}//printf("%d\n", que.size());while(!que.empty()){State u = que.front(); que.pop();if(mod(u) == 0){res = u;return 1;}if(u.len>=500) continue;for(int i=0; i<M; i++){State v = u;v.st[v.len++] = num[i];if(!vis[mod(v)]){que.push(v);vis[mod(v)] = 1;}}}return -1; }int main() {int T;scanf("%d", &T);while(T--){scanf("%d%d%d", &N, &C, &M);int tp = 0;for(int i=0; i<M; i++){char s[10];scanf("%s", s);num[tp++] = s[0];}sort(num, num+M); /* for(int i=0; i<M; i++) printf("%c ", num[i]);printf("\n");*/if(N == 0){if(num[0] == '0') printf("0\n");else printf("give me the bomb please\n"); }else {if(bfs() > 0)print(res);else printf("give me the bomb please\n");}}return 0; }?
轉載于:https://www.cnblogs.com/xingxing1024/p/5022051.html
總結
以上是生活随笔為你收集整理的HDU1226 搜索 bfs xingxing在努力的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dbms_job涉及到的知识点
- 下一篇: 并查集(图论) LA 3644 X-Pl