zoukankan      html  css  js  c++  java
  • USACO section 1.2.3 Name That Number

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


  • 相关阅读:
    Spring Boot发布2.6.2、2.5.8:升级log4j2到2.17.0
    如何优雅地读写HttpServletRequest和HttpServletResponse的请求体
    更快的Maven来了
    Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)
    NumPy学习笔记
    来自Java程序员的Python新手入门小结
    Java应用日志如何与Jaeger的trace关联
    Jaeger知识点补充
    分布式调用链跟踪工具Jaeger?两分钟极速体验
    Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body)
  • 原文地址:https://www.cnblogs.com/dollarzhaole/p/3188922.html
Copyright © 2011-2022 走看看