1. 程式人生 > >超級密碼(BFS)

超級密碼(BFS)

fst list 開始 提示 密碼 fstream 歷史 pop esc

Problem Description

Ignatius花了一個星期的時間終於找到了傳說中的寶藏,寶藏被放在一個房間裏,房間的門用密碼鎖起來了,在門旁邊的墻上有一些關於密碼的提示信息:
密碼是一個C進制的數,並且只能由給定的M個數字構成,同時密碼是一個給定十進制整數N(0<=N<=5000)的正整數倍(如果存在多個滿足條件的數,那麽最小的那個就是密碼),如果這樣的密碼存在,那麽當你輸入它以後門將打開,如果不存在這樣的密碼......那就把門炸了吧.

註意:由於寶藏的歷史久遠,當時的系統最多只能保存500位密碼.因此如果得到的密碼長度大於500也不能用來開啟房門,這種情況也被認為密碼不存在.

Input

輸入數據的第一行是一個整數T(1<=T<=300),表示測試數據的數量.每組測試數據的第一行是兩個整數N(0<=N<=5000)和C(2<=C<=16),其中N表示的是題目描述中的給定十進制整數,C是密碼的進制數.測試數據的第二行是一個整數M(1<=M<=16),它表示構成密碼的數字的數量,然後是M個數字用來表示構成密碼的數字.兩個測試數據之間會有一個空行隔開.

註意:在給出的M個數字中,如果存在超過10的數,我們約定用A來表示10,B來表示11,C來表示12,D來表示13,E來表示14,F來表示15.我保證輸入數據都是合法的.

Output

對於每組測試數據,如果存在要求的密碼,則輸出該密碼,如果密碼不存在,則輸出"give me the bomb please".

註意:構成密碼的數字不一定全部都要用上;密碼有可能非常長,不要試圖用一個整型變量來保存密碼;我保證密碼最高位不為0(除非密碼本身就是0).

SampleInput

3
22 10
3
7 0 1

2 10
1
1

25 16
3
A B C

SampleOutput

110
give me the bomb please
CCB

kuangbin搜索好像有個類似的題目,也是找只能由幾個數構成某個數的倍數,不同的是那個題只能有01構成而且有SPJ,這道題是輸入且輸出字典序最小的。
技術分享圖片

做題歷程=7=,最開始思路錯了去從n的倍數開始搜TLE,然後正確的思路沒有判斷取模時0的情況RE,再然後沒有把char換成intWA,=7=簡直了

思路就是從給定的幾個數開始搜索,然後每次加上那幾個數,取模判重一下就行了。

值得註意的是因為涉及到進制,一定要註意字母和數字之間的轉換。

代碼:

  1 #include <iostream>
  2 #include <string>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <sstream>
  6 #include <iomanip>
  7 #include <map>
  8 #include <stack>
  9 #include <deque>
 10 #include <queue>
 11 #include <vector>
 12 #include <set>
 13 #include <list>
 14 #include <cstring>
 15 #include <cctype>
 16 #include <algorithm>
 17 #include <iterator>
 18 #include <cmath>
 19 #include <bitset>
 20 #include <ctime>
 21 #include <fstream>
 22 #include <limits.h>
 23 #include <numeric>
 24 
 25 using namespace std;
 26 
 27 #define F first
 28 #define S second
 29 #define mian main
 30 #define ture true
 31 
 32 #define MAXN 1000000+5
 33 #define MOD 1000000007
 34 #define PI (acos(-1.0))
 35 #define EPS 1e-6
 36 #define MMT(s) memset(s, 0, sizeof s)
 37 typedef unsigned long long ull;
 38 typedef long long ll;
 39 typedef double db;
 40 typedef long double ldb;
 41 typedef stringstream sstm;
 42 const int INF = 0x3f3f3f3f;
 43 
 44 map<int,int>mp,vis;
 45 int n,k,m;
 46 
 47 int Mod(string x){
 48     int res = 0;
 49     for(int i = 0; i < x.size(); i++){
 50         res *= k;
 51         if(isdigit(x[i])){  //WA那次就是這裏忘記轉換數字了=7=
 52             res += x[i] - 0;
 53         }
 54         else{
 55             res += x[i] - A + 10;
 56         }
 57         res %= n;
 58         //cout << res << "  ";
 59     }
 60     return res;
 61 }
 62 
 63 int bfs(){
 64     queue<string>q;
 65     for(int i = 1; i <= 16; i++){
 66         if(mp[i]){
 67             string a = "";
 68             a = a + char(i>=10?char(A+i-10):char(0+i));  //註意轉換
 69             int flag = Mod(a);
 70             if(flag == 0){
 71                 cout << a << endl;
 72                 return 0;
 73             }
 74             else{
 75                 if(vis[flag] == 0){
 76                     vis[flag]++;
 77                     q.push(a);
 78                     //cout << a << "  " << a.size() << "  " << flag << endl;
 79                 }
 80             }
 81         }
 82     }
 83     while(!q.empty()){
 84         string tp = q.front();
 85         q.pop();
 86         if(tp.size() >= 500){
 87             return -1;
 88         }
 89         for(int i = 0; i <= 16; i++){
 90             if(mp[i]){
 91                 string nxt = tp;
 92                 nxt = nxt + char(i>=10?char(A+i-10):char(0+i));
 93                 int flag = Mod(nxt);
 94                 if(flag == 0){
 95                     cout << nxt << endl;
 96                     return 0;
 97                 }
 98                 else{
 99                     if(vis[flag] == 0){
100                         vis[flag]++;
101                         q.push(nxt);
102                         //cout << nxt << "  " << nxt.size() << "  " << flag <<endl;
103                     }
104                 }
105             }
106         }
107     }
108     return -1;
109 
110 }
111 
112 int main(){
113     ios_base::sync_with_stdio(false);
114     cout.tie(0);
115     cin.tie(0);
116     int t;
117     cin>>t;
118     while(t--){
119         mp.clear();
120         vis.clear();
121         cin>>n>>k>>m;
122         for(int i = 0; i < m; i++){
123             char tp;
124             cin>>tp;
125             if(isdigit(tp)){
126                 mp[tp - 0]++;
127             }
128             else{
129                 mp[tp - A + 10]++;
130             }
131         }
132         if(n == 0){  //特判n為0的情況
133             if(mp[0]){
134                 cout << 0 << endl;
135                 continue;
136             }
137             else{
138                 cout << "give me the bomb please" << endl;
139                 continue;
140             }
141         }
142         if(bfs() == -1){
143             cout << "give me the bomb please" << endl;
144         }
145     }
146     return 0;
147 }

超級密碼(BFS)