zoukankan      html  css  js  c++  java
  • BNU OJ 第26303 题 Touchscreen Keyboard

      BNU OJ26303Touchscreen Keyboard题目链接)的解题报告。

      原题如下:

    Touchscreen Keyboard

    Problem Description

    Nowadays, people do not use hardware keyboards but touchscreens. Usually, they touch on the wrong letters with their chunky fingers, because screen space is precious and the letters therefore too small.

    Usually, a spell checker runs after typing a word and suggests other words to select the correct spelling from. Your job is to order that list so that more likely words are on top. The typical touchscreen keyboard looks like this:

    qwertyuiop
    asdfghjkl
    zxcvbnm

    You should use the distance between the letters to type a word: the distance is the sum of the horizontal and vertical distance between the typed and proposed letter. Assume you typed a w, the distance to e is 1, while the distance to z is 3.

    The typed word and the list of words from the spell checker all have the same length. The distance between two words is the sum of the letter distances. So the distance between ifpv and icpc is 3.

    Input

    The first line of the input specifies the number of test cases t (0 < t < 20). Each test case starts with a string and an integer l on one line. The string gives the word that was typed using the touchscreen keyboard, while l specifies the number of entries in the spell checker list (0 < l ≤ 10). Then follow l lines, each with one word of the spell checker list. You may safely assume that all words of one test case have the same length and no word is longer than 10 000 characters (only lowercase 'a' - 'z'). Furthermore, each word appears exactly once in the spell checker list on one test case.

    Output

    For each test case, print the list of words sorted by their distance ascending. If two words have the same distance, sort them alphabetically. Print the distance of each word in the same line.

    Sample Input

    2
    ifpv 3
    iopc
    icpc
    gcpc
    edc 5
    wsx
    edc
    rfv
    plm
    qed

    Sample Output

    icpc 3
    gcpc 7
    iopc 7
    edc 0
    rfv 3
    wsx 3
    qed 4
    plm 17

      先判断在键盘第几行,再判断在键盘的第几列。行差加上列差,即为所需误差,然后求和即可。

      C++语言代码如下:

    /***
    *
    *                     Touchscreen Keyboard
    *
    *
    *                                                  叶剑飞
    *                                                    2012年10月3日
    *
    *******************************************************************************/
    
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cassert>
    
    using namespace std;
    
    const char * first = "qwertyuiop";
    const char * second = "asdfghjkll";
    const char * third = "zxcvbnm";
    
    typedef struct
    {
        char word[10002];
        int sum;
    } CORRECT;
    
    int PosInFirst( const char ch )
    {
        for ( int i = 0 ; first[i] != '\0' ; i ++ )
        {
            if ( ch == first[i] )
                return i + 1;
        }
        return 0;
    }
    
    int PosInSecond( const char ch )
    {
        for ( int i = 0 ; second[i] != '\0' ; i ++ )
        {
            if ( ch == second[i] )
                return i + 1;
        }
        return 0;
    }
    
    int PosInThird( const char ch )
    {
        for ( int i = 0 ; third[i] != '\0' ; i ++ )
        {
            if ( ch == third[i] )
                return i + 1;
        }
        return 0;
    }
    
    int FindError( const char a, const char b )
    {
        int n;
        int pos_a, pos_b;
        if ( (pos_a = PosInFirst(a)) )
        {
            if ( (pos_b = PosInFirst(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
            }
            else if ( (pos_b = PosInSecond(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
                n ++;
            }
            else if ( (pos_b = PosInThird(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
                n += 2;
            }
        }
        else if ( (pos_a = PosInSecond(a)) )
        {
            if ( (pos_b = PosInFirst(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
                n ++;
            }
            else if ( (pos_b = PosInSecond(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
            }
            else if ( (pos_b = PosInThird(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
                n ++;
            }
        }
        else if ( (pos_a = PosInThird(a)) )
        {
            if ( (pos_b = PosInFirst(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
                n += 2;
            }
            else if ( (pos_b = PosInSecond(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
                n ++;
            }
            else if ( (pos_b = PosInThird(b)) )
            {
                n = pos_b - pos_a;
                if (n < 0 )
                    n = -n;
            }
        }
        else
            assert( false );
        return n;
    }
    
    bool cmp( const CORRECT & a, const CORRECT & b )
    {
        if ( a.sum == b.sum )
        {
            if ( strcmp( a.word, b.word ) < 0 )
                return true;
            else
                return false;
        }
        else
            return a.sum < b.sum;
    }
    
    int main (void)
    {
        int i, j;
        int n, m;
        char wrong[10002];
        CORRECT correct[16];
        scanf( "%d", &n );
        while ( n -- )
        {
            scanf( "%s%d", wrong, &m );
            for ( i = 0 ; i < m  ; i ++ )
            {
                correct[i].sum = 0;
                scanf( "%s", correct[i].word );
                for ( j = 0; correct[i].word[j] != '\0' ; j ++ )
                    correct[i].sum += FindError( wrong[j], correct[i].word[j] );
            }
            sort( correct, correct+m, cmp );
            for ( i = 0 ; i < m  ; i ++ )
                printf( "%s %d\n", correct[i].word, correct[i].sum );
        }
        return 0;
    }
  • 相关阅读:
    【原创】大叔经验分享(53)kudu报错unable to find SASL plugin: PLAIN
    【原创】大叔经验分享(52)ClouderaManager修改配置报错
    【原创】大数据基础之Impala(3)部分调优
    【原创】大数据基础之Kudu(3)primary key
    【原创】大叔经验分享(51)docker报错Exited (137)
    【原创】大数据基础之Logstash(5)监控
    【原创】大数据基础之Logstash(4)高可用
    【原创】Linux基础之vi&vim基础篇
    【原创】大叔经验分享(50)hue访问mysql(librdbms)
    【原创】大叔经验分享(49)hue访问hdfs报错/hue访问oozie editor页面卡住
  • 原文地址:https://www.cnblogs.com/yejianfei/p/2711215.html
Copyright © 2011-2022 走看看