BOJ 23085 - 판치기

image.png

NN이 작으므로 BFS로 풀어줄 수 있다.

현재 상태를 HH가 몇개가 있는지로 두자.

현재 개수에서 HHxx개 뒤집기로 했다면, TTkxk-x 개 뒤집는다.

그럼 결국 TTxx개 생기고 HHkxk-x개 생기므로 HHk2xk-2x 개 생긴다.

이렇게 BFS로 최단경로를 돌려주면 된다.

void solve() {  
   int n, k;  
   string s;  
   cin >> n >> k >> s;  
   int h = cntt(s, 'H');  
   vi vis(n + 1);  
   queue<int> q;  
   q.push(h);  
   vis[h] = 1;  
   int ans = 0;  
   while (sz(q)) {  
      int size = sz(q);  
      while (size--) {  
         int cur = q.front();  
         if (cur == 0) goto out;  
         q.pop();  
         for (int h = 0; h <= k; h++) {  
            int t = k - h;  
            int nxt = cur - h + t;  
            if (cur >= h && n - cur >= t && !vis[nxt]) {  
               vis[nxt] = 1;  
               q.push(nxt);  
            }  
         }  
      }  
      ans++;  
   }  
   out:;  
   cout << (!vis[0] ? -1 : ans);  
}

Tags:

Categories:

Updated:

Comments