SRM 477 Div1 Easy:Islands

keyword

C++

概要

六角格子のセルに海or陸が割り振られている。海と陸の境界線の個数を求める問題。
すぐに思いつく方法は2通り。1つは各陸に対して隣が海かどうかを調べる方法。2つ目は各辺に対してそれを挟むセルが異なるかどうかを調べる方法。偶奇に注意しながら2つ目の方法で実装して無事AC。

class Islands {
public:
int beachLength(vector <string> kingdom) {
    int ret=0;
    int i, j, n=SZ(kingdom), m=SZ(kingdom[0]);
    REP(i,n)REP(j,m-1)if(kingdom[i][j]!=kingdom[i][j+1]) ret++;
    REP(i,n-1){
        if(i%2==0){
            REP(j,m){
                if(kingdom[i][j]!=kingdom[i+1][j])ret++;
                if(j>0 && kingdom[i][j]!=kingdom[i+1][j-1])ret++;
            }
        }
        else{
            REP(j,m){
                if(kingdom[i][j]!=kingdom[i+1][j])ret++;
                if(j<m-1 && kingdom[i][j]!=kingdom[i+1][j+1])ret++;
            }
        }
    }
    return ret;
}