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;
}