問題
http://community.topcoder.com/stat?c=problem_statement&pm=10874&rd=14157
六角形で表されるlandとwaterのエリアがあり、
その接点がビーチとなる。
地形が与えられたとき、存在するビーチの数を求める。
解き方
ビーチとなる条件を判定文に落とし込んで実装するだけ。
まず、ビーチはlandとwaterひとつずつに接する場合なので
landについて調べることで重複なく調べられる。
あとは、高さのMOD2が0のときと1のときの条件を落としこんで
実装してあげれば良い。
コード
class Islands {
public: int beachLength(vector<string> kingdom) {
int h=kingdom.size(),w=kingdom[0].size();
int ret=0;
FORE(i,0,h)FORE(j,0,w)if(kingdom[i][j]=='#'){
if(j-1>=0 && kingdom[i][j-1]=='.')ret++;
if(j+1<w && kingdom[i][j+1]=='.')ret++;
if(i-1>=0 && kingdom[i-1][j]=='.')ret++;
if(i+1<h && kingdom[i+1][j]=='.')ret++;
if(i%2==0 && j-1>=0 && i+1<h && kingdom[i+1][j-1]=='.')ret++;
if(i%2==0 && j-1>=0 && i-1>=0 && kingdom[i-1][j-1]=='.')ret++;
if(i%2 && j+1<w && i+1<h && kingdom[i+1][j+1]=='.')ret++;
if(i%2 && j+1<w && i-1>=0 && kingdom[i-1][j+1]=='.')ret++;
}
return ret;
}
};
public: int beachLength(vector<string> kingdom) {
int h=kingdom.size(),w=kingdom[0].size();
int ret=0;
FORE(i,0,h)FORE(j,0,w)if(kingdom[i][j]=='#'){
if(j-1>=0 && kingdom[i][j-1]=='.')ret++;
if(j+1<w && kingdom[i][j+1]=='.')ret++;
if(i-1>=0 && kingdom[i-1][j]=='.')ret++;
if(i+1<h && kingdom[i+1][j]=='.')ret++;
if(i%2==0 && j-1>=0 && i+1<h && kingdom[i+1][j-1]=='.')ret++;
if(i%2==0 && j-1>=0 && i-1>=0 && kingdom[i-1][j-1]=='.')ret++;
if(i%2 && j+1<w && i+1<h && kingdom[i+1][j+1]=='.')ret++;
if(i%2 && j+1<w && i-1>=0 && kingdom[i-1][j+1]=='.')ret++;
}
return ret;
}
};