開始好好寫解題報告的代碼註釋了嗚嗚。
題目概述:
把中心翻譯過來:要給奶牛命名,一個奶牛有好幾種可能的名字,找到在字典中出現過的奶牛的名字。
字典包含5000以下的字符串,每個字符串小於20字母。
算法思想:
其實可以自然而然有兩種想法,第一種是讀入一個數,然後計算出其所有可能出現的組合。比如題中的4734所對應的各種奇怪字母字符串。然後對於每一個字符串,都去字典裏面掃一遍。
第二種做法的話是先把字典翻譯過來,然後字典遍歷一遍對應,看相同的字符的話就開始輸出。
嗯其實顯然是第二種更快呀。
所以思想就在這裏了,代碼的具體實現如下。
這次的代碼開始有註釋了喲。
代碼部分:
#include <iostream> #include <fstream> #include <string> using namespace std; ifstream fin("namenum.in"); ofstream fout("namenum.out"); ifstream in("dict.txt"); int k; // C++ 有string這種東西,就讓我拋棄了char[]了,這裏string數組存了txt中的所有input string s[5000]; // map 這個數組做了一個字典序,就是將字母轉化爲數字 int map[26] = { 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 0, 7, 7, 8, 8, 8, 9, 9, 9, 0 }; int main() { string num; bool flag = 0; k = 0; // 將txt中所有input存進s[],同時記錄一共有多少個string while (in >> s[k]) { k++; } fin >> num; for (int i = 0; i < k; i++) { // 大Flag是判斷當前word是不是,小flag記得是有沒有合適的輸出。 int Flag = 1; // 下句是剪枝,如果size不相符的話直接就退出 if (num.size() != s[i].size()) continue; for (int j = 0; j < s[i].size(); j++) { // ASCII碼的操作 if (map[s[i][j] - 'A'] != num[j] - '0') { Flag = 0; break; } } if (Flag) { flag = 1; fout << s[i] << endl; } } if (!flag) { fout << "NONE" << endl; } return 0; }