1. 比较简单,但是用到了文件读写,终于明白了给的test代码中的fout和fin是什么意思了,哈哈;
2. 如果按照一般的思路,肯定会超时,所以把dict转换成数字,这样的算法效率是固定的
以下是代码:
/* ID: dollar4 PROG: namenum LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <algorithm> #include <cstring> using namespace std; char get_num(char a) { switch (a) { case 'A' : return '2'; case 'B' : return '2'; case 'C' : return '2'; case 'D' : return '3'; case 'E' : return '3'; case 'F' : return '3'; case 'G' : return '4'; case 'H' : return '4'; case 'I' : return '4'; case 'J' : return '5'; case 'K' : return '5'; case 'L' : return '5'; case 'M' : return '6'; case 'N' : return '6'; case 'O' : return '6'; case 'P' : return '7'; case 'R' : return '7'; case 'S' : return '7'; case 'T' : return '8'; case 'U' : return '8'; case 'V' : return '8'; case 'W' : return '9'; case 'X' : return '9'; case 'Y' : return '9'; } } int main() { ofstream fout ("namenum.out"); ifstream fin ("namenum.in"); string str, fstr, cstr; int i, cnt = 0; ifstream dictfile("dict.txt"); fin >> str; while (dictfile >> fstr) { cstr = ""; for (unsigned int k = 0; k < fstr.length(); k++) { cstr += get_num(fstr[k]); } // cout << cstr << endl; if (str == cstr) { fout << fstr << endl; cnt++; } } if (cnt == 0) fout << "NONE" << endl; return 0; }
以下是官方参考代码:
/*Here is Argentina competitor's Michel Mizrah's solution using the first method with a binary search. While it is blazingly fast, it does have the disadvantage of some fairly tricky coding in the binary search routine. A single off-by-one error would doom a program in a contest. */ #include <stdio.h> #include <stdlib.h> #include <string.h> char num[12],sol[12]; char dict[5000][13]; int nsolutions = 0; int nwords; int maxlen; FILE *out; void calc (int charloc, int low, int high) { if (charloc == maxlen) { sol[charloc] = '\0'; for (int x = low; x < high; x++) { if (strcmp (sol, dict[x]) == 0) { fprintf (out, "%s\n", sol); nsolutions++; } } return; } if (charloc > 0) { for (int j=low; j <= high; j++){ if (sol[charloc-1] == dict[j][charloc-1]) { low=j; while (sol[charloc-1] == dict[j][charloc-1]) j++; high=j; break; } if (j == high) return; } } if (low > high) return; switch(num[charloc]){ case '2':sol[charloc] = 'A'; calc(charloc+1,low,high); sol[charloc] = 'B'; calc(charloc+1,low,high); sol[charloc] = 'C'; calc(charloc+1,low,high); break; case '3':sol[charloc] = 'D'; calc(charloc+1,low,high); sol[charloc] = 'E'; calc(charloc+1,low,high); sol[charloc] = 'F'; calc(charloc+1,low,high); break; case '4':sol[charloc] = 'G'; calc(charloc+1,low,high); sol[charloc] = 'H'; calc(charloc+1,low,high); sol[charloc] = 'I'; calc(charloc+1,low,high); break; case '5':sol[charloc] = 'J'; calc(charloc+1,low,high); sol[charloc] = 'K'; calc(charloc+1,low,high); sol[charloc] = 'L'; calc(charloc+1,low,high); break; case '6':sol[charloc] = 'M'; calc(charloc+1,low,high); sol[charloc] = 'N'; calc(charloc+1,low,high); sol[charloc] = 'O'; calc(charloc+1,low,high); break; case '7':sol[charloc] = 'P'; calc(charloc+1,low,high); sol[charloc] = 'R'; calc(charloc+1,low,high); sol[charloc] = 'S'; calc(charloc+1,low,high); break; case '8':sol[charloc] = 'T'; calc(charloc+1,low,high); sol[charloc] = 'U'; calc(charloc+1,low,high); sol[charloc] = 'V'; calc(charloc+1,low,high); break; case '9':sol[charloc] = 'W'; calc(charloc+1,low,high); sol[charloc] = 'X'; calc(charloc+1,low,high); sol[charloc] = 'Y'; calc(charloc+1,low,high); break; } } int main(){ FILE *in=fopen ("namenum.in", "r"); FILE *in2=fopen ("dict.txt", "r"); int j; out=fopen ("namenum.out","w"); for (nwords = 0; fscanf (in2, "%s", &dict[nwords++]) != EOF; ) ; fscanf (in, "%s",&num); maxlen = strlen(num); calc (0, 0, nwords); if (nsolutions == 0) fprintf(out,"NONE\n"); return 0; }
另一个官方代码:
/*The solution below might be considered to be a bit more straightforward: no tricky offsets, no +1 or -1, no knowledge about character values. The lines of actual code in this solution are minimal.*/ This is the sort of program that might work reliably the first time and every time. The only tricky part is knowing that scanf will yield string without a newline on the end: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *in = fopen ("namenum.in", "r"); FILE *in2 = fopen ("dict.txt", "r"); FILE *out = fopen ("namenum.out","w"); int nsolutions = 0; int numlen; char word[80], num[80], *p, *q, map[256]; int i, j; map['A'] = map['B'] = map['C'] = '2'; map['D'] = map['E'] = map['F'] = '3'; map['G'] = map['H'] = map['I'] = '4'; map['J'] = map['K'] = map['L'] = '5'; map['M'] = map['N'] = map['O'] = '6'; map['P'] = map['R'] = map['S'] = '7'; map['T'] = map['U'] = map['V'] = '8'; map['W'] = map['X'] = map['Y'] = '9'; fscanf (in, "%s",num); numlen = strlen(num); while (fscanf (in2, "%s", word) != EOF) { for (p=word, q=num; *p && *q; p++, q++) { if (map[*p] != *q) break; } if (*p == '\0' && *q == '\0') { fprintf (out, "%s\n", word); nsolutions++; } } if (nsolutions == 0) fprintf(out,"NONE\n"); return 0; }