このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。
イジングモデルとは、磁性体の性質をシミュレーションする統計的物理学でよく用いられているモデルである。このモデルでは、長方形のグリッドを考え、各点で+と-という値があると考える。
そのような詩ピンの設定があった時、エネルギーは隣り合うセルとの組み合わせを足し合わせることによって計算される(水平方向と垂直方向のみ考える)。もし、対が同じ値(+と+、あるいは-と-)であれば、エネルギーの合計量に-1を加える。そうでなければ、+1を加えることになる。spins[]という各点の値が与えられるとき、この状態に対するエネルギーの合計量を計算せよ。 (注:spins[]の各要素は同じ長さであり、+や-という文字が長方形に並ぶのである)
私の解答はこちら。
public class IsingModel { public int energy(String[] spins) { int nRow = spins.length; int nCol = spins[0].length(); int nSame = 0; int nDiff = 0; for( int i=0 ; i<nRow ; i++ ){ for( int j=0 ; j<nCol-1 ; j++ ){ if( spins[i].charAt(j) == spins[i].charAt(j+1) ){ nSame++; }else{ nDiff++; } } } for( int i=0 ; i<nRow-1 ; i++ ){ for( int j=0 ; j<nCol ; j++ ){ if( spins[i].charAt(j) == spins[i+1].charAt(j) ){ nSame++; }else{ nDiff++; } } } return nDiff-nSame; } }
ポイントは、水平方向と垂直方向で、ループのさせ方が異なるので、2回に分けて計算するということだと思います。それ以外は、特に悩まなかったです。
0 件のコメント:
コメントを投稿