USACO 1.2 Problem 3 Name That Number


開始好好寫解題報告的代碼註釋了嗚嗚。

題目概述:

把中心翻譯過來:要給奶牛命名,一個奶牛有好幾種可能的名字,找到在字典中出現過的奶牛的名字。

字典包含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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章