BOJ 23085 - 판치기

image.png

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

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

현재 개수에서 $H$를 $x$개 뒤집기로 했다면, $T$는 $k-x$ 개 뒤집는다.

그럼 결국 $T$가 $x$개 생기고 $H$가 $k-x$개 생기므로 $H$는 $k-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