2011年9月14日水曜日

TopCoder SRM231 Div2 450Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。

多くの画像編集プログラムでは、二つの画像を縫い合わせて大きな画像を作るということができる。この問題では、二つの画像を表す文字列が与えられる。文字列はビットマップ(非圧縮画像ですね)を表しており、文字列のi番目の要素の値jというのは、画像においてはi行j列の色を表している。二つのイメージを縫い合わせることを行え。この問題では画像A[]を画像B[]の左に置き、Aの右側とBの左側を重ねる。明らかな人工物であることを防ぐために、縫い合わせた領域はAからBに向けて徐々に色が混ざるようにしたい。重なっている領域の左からi番目(i=1から始まるとする)の値は次式のようになる。

((overlap+1-i)*a+(i*b))/(overlap+1)

ここで、aとbはそれぞれAとBの画素値である。overlapは重ねた画素数である。したがって、重なっている領域の一番左の画素値は次のようになる。

(overlap*a+b)/(overlap+1).

なお、どの場合でも値は最も近い整数値に変換せよ(四捨五入せよ)。画素値は文字のASCIIコードの値で与えられる。

私の解答はこちら。

public class Stitch {
 public String[] stitch(String[] A, String[] B, int overlap) {
  String[] blended = new String[A.length];
  for( int i=0 ; i<A.length ; i++ ){
   blended[i] = A[i].substring(0, A[i].length()-overlap);
   for( int j=1 ; j<=overlap ; j++ ){
    double val = ((overlap+1.0-j)*A[i].charAt(A[i].length()-overlap+j-1)+j*B[i].charAt(j-1))
      /(overlap+1);
    char cval = (char)Math.round(val);
    blended[i] += cval;
   }
   blended[i] += B[i].substring(overlap);
  }
  return blended;
 }

}

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計