解いた問題のソースコードと解説など。


SRM 498 Div2 Hard NinePuzzle

問題

http://apps.topcoder.com/stat?c=problem_statement&pm=11225&rd=14427

ピラミッド型の8パズルの初期局面とゴールとなる局面が与えられる。任意のピースを任意の回数動かして初期局面からゴールとなる最終局面まで遷移したい。遷移できないときは初期局面のピースの色を塗り替えて良い。最終局面を得るために必要な塗り替えの最小回数を求めよ。

やりかた

15パズルと異なり、このパズルはピースの色と種類が一致しているなら、どんな状態間でも遷移できる。つまりどんな局面にもできる。簡単にして、2パズルで考えてみるといい。
となると、もともと各色のパネル数の違いのみが問題になる。これを調べればいい。

以下ソース。

class NinePuzzle {
public:
  int getMinimumCost(string init, string goal) {
    int result = 0;
    map<char, int> in, go;
    for(int i = 0; i < (int)init.length(); i++)
      in[init[i]]++, go[goal[i]]++;

    result += abs(in['R'] - go['R']) + abs(in['G'] - go['G'])
      + abs(in['B'] - go['B']) + abs(in['Y'] - go['Y']);
    result /= 2;
    
    return result;
  }
};

これはすぐわかってできた。やった!

でも本番AC数311人て多すぎィ!

Get up! 明日のSUPER ST@R!