5886. 如果相鄰兩個顏色均相同則刪除當前顏色(錯誤程式碼)
阿新 • • 發佈:2021-10-17
-
開始想到了標記可以刪除的,然後輪流A、B直到誰沒有能夠刪除的字元就輸。
但是後面考慮了很多奇怪的邊界,比如如果刪掉了字元之後是否需要重新計算可以刪去的字元。如果要考慮刪去後的標記,應該用什麼容器來儲存,因為刪去字串裡面的字元,那麼標記容器所對應的位置也需要刪去對應標記。
但是除錯了很久發現有很多奇奇怪怪的BUG,用了太多時間就沒有繼續下去了。
-
後面看了別人用遍歷了一邊,直接比較兩人可以刪除次數。不需要像我這一樣考慮這麼多情況。
刪去字元,因為左右相鄰的都是相同的字元才會被標記,比如 AAA 都是 A 那麼刪去中間字元之後剩下 AA 並沒有改變可以刪除的情況,所以這裡是不需要額外處理的。所以當時沒有想到這一點,把程式碼處理複雜化了。
// 錯誤程式碼 #include <bits/stdc++.h> using namespace std; // 標記字元是否可刪除 vector<bool> isDel; // 對刪除後周圍字元重新標記 void process(string colors, int i){ // 左邊 if(colors[i-1] == colors[i-2] && colors[i-1] == colors[i]) isDel[i] = true; if(colors[i+1] == colors[i] && colors[i+1] == colors[i+2]) isDel[i] = true; } int main() { string colors; cin >> colors; // 遍歷一遍 標記可刪除字元 for(int i = 0; i < colors.size() - 1; i++){ // 跳過首尾 if(0 == i || colors.size() - 1 == i) continue; // 相鄰相等則標記 if(colors[i] == colors[i-1] && colors[i] == colors[i+1]) isDel.push_back(true); else isDel.push_back(false); } // 1 == Alice -1 == Bob int AB = 1; while(1){ bool lose = true; if(1 == AB){ // 遍歷一遍找到對應並且可以刪除的字元 for(int i = 0; i < colors.size() - 1; i++){ if('A' == colors[i] && true == isDel[i]){ colors.erase(i, 1); isDel.erase(begin(isDel) + i); lose = false; cout << i << endl; break; } } // 找不到輸了 if(true == lose){ cout << "false"; return false; } } else{ for(int i = 0; i < colors.size() - 1; i++){ if('B' == colors[i] && true == isDel[i]){ colors.erase(i, 1); isDel.erase(begin(isDel) + i); lose = false; cout << i << endl; break; } } if(true == lose){ cout << "true"; return true; } } // 改變角色 AB *= -1; } }