1. 程式人生 > 其它 >5886. 如果相鄰兩個顏色均相同則刪除當前顏色(錯誤程式碼)

5886. 如果相鄰兩個顏色均相同則刪除當前顏色(錯誤程式碼)

  • 開始想到了標記可以刪除的,然後輪流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;
	}
}