【codevs 4716】破損的鍵盤2
阿新 • • 發佈:2019-01-27
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;
}