前情提要
這篇文章記錄了在 UVA Online Judge
刷題的過程,挑戰了兩個不同類型的題目,分別是 227 - Puzzle 與 1586 -
Molar mass。
[227 - Puzzle] 這是一道模擬操作的題目,目標是在 5x5
的字串陣列中移動空白格,根據指令 (A 上移、B 下移、L 左移、R 右移)
更新陣列的配置。挑戰在於處理輸入格式和確保操作合法性 (不超出邊界)。
本題的重點在於模擬過程是否正確,並輸出最終的字串陣列,若指令導致非法操作,則需輸出錯誤訊息。
[1586 - Molar mass]
這是一道字串解析的題目,要求計算化學式的分子量。需依據化學元素的符號及其後的數字
(若無則預設為 1) 計算權重,最後輸出結果。
難點在於精確解析字串並將權重正確累加,對效能的處理也很重要。
1. Blog Image
227
- Puzzle 題目連結
這題麻煩就在輸入而已了,題目就是說
A
、B
、L
、R
這幾個操作指令,然後對 5*5
的一個字串陣列去做操作其中由一個空白,也就是移動這個空白,然後看移動可不可以合法,超過邊界就不合法了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 #include <bits/stdc++.h> using namespace std;int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); int k = 1 ; while (true ) { vector<string> mp (5 ) ; int x = -1 , y = -1 ; for (int i = 0 ; i < 5 ; i++) { getline (cin, mp[i]); if (mp[i].length () == 4 ) mp[i] += ' ' ; if (mp[0 ][0 ] == 'Z' ) return 0 ; } for (int i = 0 ; i < 5 ; i++) for (int j = 0 ; j < 5 ; j++) if (mp[i][j] == ' ' ) { x = i; y = j; } string s = "" , s1; while (true ) { getline (cin, s1); s += s1; if (s1. back () == '0' ) break ; } bool flag = true ; for (int i = 0 ; i < s.length () - 1 ; i++) { switch (s[i]) { case 'A' : if (x == 0 ) { flag = false ; break ; } swap (mp[x][y], mp[x - 1 ][y]); x--; break ; case 'B' : if (x == 4 ) { flag = false ; break ; } swap (mp[x][y], mp[x + 1 ][y]); x++; break ; case 'L' : if (y == 0 ) { flag = false ; break ; } swap (mp[x][y], mp[x][y - 1 ]); y--; break ; case 'R' : if (y == 4 ) { flag = false ; break ; } swap (mp[x][y], mp[x][y + 1 ]); y++; break ; } if (!flag) break ; } if (k > 1 ) cout << endl; cout << "Puzzle #" << k++ << ":" << endl; if (!flag) { cout << "This puzzle has no final configuration." << endl; continue ; } for (int i = 0 ; i < 5 ; i++) { for (int j = 0 ; j < 5 ; j++) { cout << mp[i][j]; if (j != 4 ) cout << " " ; } cout << endl; } } return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #include <bits/stdc++.h> using namespace std;unordered_map<char , float > atomic_map = { {'C' , 12.01 }, {'H' , 1.008 }, {'O' , 16.00 }, {'N' , 14.01 } }; int main () { ios::sync_with_stdio (0 ); cin.tie (0 ); int t; cin >> t; while (t--) { string atomic; cin >> atomic; atomic += 'Z' ; string number; int i = 0 ; double total = 0 ; while (i < atomic.size ()) { if (i != 0 ) { if (atomic[i] >= 65 ) { total += atomic_map[atomic[(i - number.size ()) - 1 ]] * stoi (number.size () == 0 ? "1" : number); number = "" ; } else number += atomic[i]; } i++; } printf ("%.3f\n" , total); } }