UVA 10415
CPE 2020/12/22考題
解題心得:
每個音階都有對應的指法,如果欲彈奏下一個音階須按下的手指與上一個重複,則不用額外計算。
1.建立MAP來儲存每個音階要按的手指
2.建立一個狀態表(陣列)來儲存每個手指當前狀態(0沒按1按),在建立一個記數表來記錄每個手指按下幾次。
3.每次讀到下一個音階時先去狀態表查閱當前手指狀態,如果該按而還沒按則按下(記數+1)。
4.依據MAP的資料把該放開的手指放開(狀態表)。
程式碼如下:
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
int main()
{
cin.tie(0) , cin.sync_with_stdio(0);
map<char , vector<int>> mc;
mc['c'] = {0,0,1,1,1,0,0,1,1,1,1};
mc['d'] = {0,0,1,1,1,0,0,1,1,1,0};
mc['e'] = {0,0,1,1,1,0,0,1,1,0,0};
mc['f'] = {0,0,1,1,1,0,0,1,0,0,0};
mc['g'] = {0,0,1,1,1,0,0,0,0,0,0};
mc['a'] = {0,0,1,1,0,0,0,0,0,0,0};
mc['b'] = {0,0,1,0,0,0,0,0,0,0,0};
mc['C'] = {0,0,0,1,0,0,0,0,0,0,0};
mc['D'] = {0,1,1,1,1,0,0,1,1,1,0};
mc['E'] = {0,1,1,1,1,0,0,1,1,0,0};
mc['F'] = {0,1,1,1,1,0,0,1,0,0,0};
mc['G'] = {0,1,1,1,1,0,0,0,0,0,0};
mc['A'] = {0,1,1,1,0,0,0,0,0,0,0};
mc['B'] = {0,1,1,0,0,0,0,0,0,0,0};
int t;
cin >> t;
string s;
getline(cin , s);
while(t--){
int finger[11] = {0};
int fingerCount[11] = {0};
getline(cin , s);
for(int i = 0; i < s.length(); i++){
if(mc.count(s[i]) == 0) continue;
for(int j = 1; j < 11; j++) {
if(mc[s[i]][j] == 1) {
if(finger[j] == 0) {
fingerCount[j]++;
finger[j] = 1;
}
}
}
for(int k = 0; k <11; k++){
finger[k] = mc[s[i]][k];
}
}
for(int i = 1; i < 11 ;i++){
cout << fingerCount[i] <<" ";
}
cout << "\n";
}
return 0;
}