1. 程式人生 > >【codevs 4716】破損的鍵盤2

【codevs 4716】破損的鍵盤2

4716 破損的鍵盤2
時間限制: 1 s
空間限制: 16000 KB
題目等級 : 白銀 Silver
題解
檢視執行結果
題目描述 Description
這個鍵盤壞掉了。字母的順序被弄亂了。

你毫不知情,當你列印文件的時候,你甚至沒有開啟顯示屏。

當你開啟顯示屏的時候,你看到了一個悲劇的文件。

你的任務,就是將這一份悲劇的文件還原成正常的文件。

題目中,所有的字母都向右移了一格,如N–>M,(注意大小寫)

在最右邊的字母會轉換成最左邊的字母,如m–>z (注意大小寫)

輸入描述 Input Description
輸入是一個由字母和下劃線(下劃線沒有變化)組成的字串

輸出描述 Output Description
輸出是還原後的文件。

樣例輸入 Sample Input
樣例:

Jraap_Eptaf

樣例輸出 Sample Output
樣例:

Hello_World

資料範圍及提示 Data Size & Hint
字元長度<=100000;

1.模擬

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005
; char s[MAXN]; int lens; //鍵盤什麼樣就怎麼返回 char change(char x,int in) { if(in == 0)// xiaoxie { if(x == 'q') return 'p'; if(x == 'w') return 'q'; if(x == 'e') return 'w'; if(x == 'r') return 'e'; if(x == 't') return 'r'; if
(x == 'y') return 't'; if(x == 'u') return 'y'; if(x == 'i') return 'u'; if(x == 'o') return 'i'; if(x == 'p') return 'o'; if(x == 'a') return 'l'; if(x == 's') return 'a'; if(x == 'd') return 's'; if(x == 'f') return 'd'; if(x == 'g') return 'f'; if(x == 'h') return 'g'; if(x == 'j') return 'h'; if(x == 'k') return 'j'; if(x == 'l') return 'k'; if(x == 'z') return 'm'; if(x == 'x') return 'z'; if(x == 'c') return 'x'; if(x == 'v') return 'c'; if(x == 'b') return 'v'; if(x == 'n') return 'b'; if(x == 'm') return 'n'; } else if(in == 1)// daxie { if(x == 'Q') return 'P'; if(x == 'W') return 'Q'; if(x == 'E') return 'W'; if(x == 'R') return 'E'; if(x == 'T') return 'R'; if(x == 'Y') return 'T'; if(x == 'U') return 'Y'; if(x == 'I') return 'U'; if(x == 'O') return 'I'; if(x == 'P') return 'O'; if(x == 'A') return 'L'; if(x == 'S') return 'A'; if(x == 'D') return 'S'; if(x == 'F') return 'D'; if(x == 'G') return 'F'; if(x == 'H') return 'G'; if(x == 'J') return 'H'; if(x == 'K') return 'J'; if(x == 'L') return 'K'; if(x == 'Z') return 'M'; if(x == 'X') return 'Z'; if(x == 'C') return 'X'; if(x == 'V') return 'C'; if(x == 'B') return 'V'; if(x == 'N') return 'B'; if(x == 'M') return 'N'; } else return x; } char out(char x) { if('a' <= x && x <= 'z') return change(x,0); else if('A' <= x && x <= 'Z') return change(x,1); else return change(x,2); } int main() { cin >> s; lens = strlen(s); for(int i = 0; i < lens; i ++) cout << out(s[i]); return 0; }

2.轉化
//ASCII碼

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
int lens;
char s[MAXN];
int num[26] = {12,22,24,19,23,4,6,7,21,8,10,11,14,2,9,15,16,5,1,18,25,3,17,26,20,13};

int main()
{
    scanf("%s",s + 1);
    lens = strlen(s + 1);
    for(int i = 1;i <= lens; i ++)
    {
        if(s[i] == '_') printf("_");
        else if(s[i] - 'a' >= 0 && s[i] - 'a' <= 26)
        printf("%c",('a' + num[s[i] - 'a'] - 1));
        else  printf("%c",('A' + num[s[i] - 'A'] - 1));
    }
    return 0;
}

第三個做法:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char dx1[15] = {"PQWERTYUIOP"}, dx2[15] = {"LASDFGHJKL"};
char dx3[15] = {"MZXCVBNM"},    xx1[15] = {"pqwertyuiop"};
char xx2[15] = {"lasdfghjkl"},  xx3[15] = {"mzxcvbnm"};
string s;
int len;

char finddx(char x){
    for(int i = 1; i <= 10; i ++){ 
        if(dx1[i] == x) return dx1[i - 1];
        if(dx2[i] == x) return dx2[i - 1];
        if(dx3[i] == x) return dx3[i - 1];
    }
}

char findxx(char x){
    for(int i = 1; i <= 10; i ++){ 
        if(xx1[i] == x) return xx1[i - 1];
        if(xx2[i] == x) return xx2[i - 1];
        if(xx3[i] == x) return xx3[i - 1];
    }
}

int main(){
    cin >> s; len = s.length();
    for(int i = 0; i < len; i ++){
        if(s[i] == '_') printf("_");
        else if('A' <= s[i] && s[i] <= 'Z')
            printf("%c",(finddx(s[i])));
        else if('a' <= s[i] && s[i] <= 'z')
            printf("%c",(findxx(s[i])));
    }
    return 0;
}