暴力暴力
菜鳥第一次寫題解,多多包涵!!!
這個題目的數據量很小,所以沒必要去使用bfs,直接分情況討論即可
一共兩排數據,我們使用貪心的思想,只需要實現從左往右的過程中每個檢測器相互連接即可,那么我們分三種情況討論
第一種情況
?
# . .
當第一排的當前有檢測器,而第一排的下一個沒有檢測器,且第二排的當前位沒有檢測器,我們不管第二排的下一個位置有沒有檢測器,我們只需要把第一排的下一個添加檢測器便能夠實現四個格子檢測器的連通
第二種情況
. # .
與第一種情況類似,只是位置變了一下
第三種情況
# . # .
這種情況相對復雜,我們不知道后面的情況,我們就只能從當前位置開始從第一排和第二排分別尋找再次出現 #的位置 ,哪排先出現哪排的后面一個就變成#
我們只需要判斷這三種情況,沒出現一次計數器加一,最后輸出結果即可
這里面可以提前來找到最先出現 # 的位置 和最后出現 # 的位置,這樣我們的循環會得到優化
希望能給你一點點小幫助
#include <bits/stdc++.h>
using namespace std;
int main()
{string s1, s2;cin >> s1 >> s2;int len = s1.size();int num = 0; // 計數器int l = len, r = 0;// 尋找第一出現和最后一個出現#的位置并記錄for (int i = 0; i < len; i++){if (s1[i] == '#' || s2[i] == '#'){l = min(l, i);r = max(r, i);}}for (int i = l; i < r; i++){// 第一種情況的判斷if (s1[i] == '#' && s1[i + 1] == '.' && s2[i] == '.'){num++;s1[i + 1] = '#';// cout << s1 << endl// ? ? ?<< s2 << endl// ? ? ?<< endl;}// 第二種情況的判斷if (s1[i] == '.' && s2[i + 1] == '.' && s2[i] == '#'){num++;s2[i + 1] = '#';// cout << s1 << endl// ? ? ?<< s2 << endl// ? ? ?<< endl;}// 第三種情況的判斷if (s1[i] == '#' && s2[i] == '#' && s2[i + 1] == '.' && s1[i + 1] == '.'){int p = i, q = i;for (int j = i + 1; j <= r; j++){if (s1[j] == '#'){p = j;break;}if (s2[j] == '#'){q = j;break;}}if (p >= q){s1[i + 1] = '#';num++;}else{s2[i + 1] = '#';num++;}// cout << s1 << endl// ? ? ?<< s2 << endl// ? ? ?<< endl;}}cout << num;return 0;
}