PKU 1610 Quad Trees

http://poj.org/problem?id=1610
白黒の画像データを、同じ部分をまとめて符号化して出力するというような問題。

再帰
結構時間ギリギリでした

bool in[512][512];
map<int,vector<int> > ans;

void dfs(int x,int y,int n){
  set<bool> app;
  rep(i,n)rep(j,n)app.insert(in[x+i][y+j]);
  if(app.size()==1)ans[-n].pb(0),ans[-n].pb(*app.begin());
  else{
    ans[-n].pb(1);
    dfs(x,y,n/2);
    dfs(x,y+n/2,n/2);
    dfs(x+n/2,y,n/2);
    dfs(x+n/2,y+n/2,n/2);
  }
}

main(){
  int t;
  cin>>t;
  while(t--){
    ans.clear();
    int n;
    cin>>n;
    rep(i,n)rep(j,n)cin>>in[i][j];
    dfs(0,0,n);
    vector<int> vec;
    FOR(miter,ans)vec.insert(vec.end(),ALL(miter->S));
    reverse(ALL(vec));
    string out;
    rep(i,SZ(vec)){
      int p=0;
      rep(j,4){
        if(i+j<SZ(vec))p+=vec[i+j]<<j;
      }
      i+=3;
      if(p<9)out+=(p+'0');
      else out+=(p-10+'A');
    }
    reverse(ALL(out));
    cout<<out<<endl;
  }
}