0569:Illumination

問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0569


















深さ優先探索した。問題文の通りに座標を配列で表現すると(0,0)等は絶対に外側になる。
(0,0)から探索して各マスで隣り合う建物の数を数えた。

#include<iostream>

using namespace std;

int h,w,grid[102][102],vis[102][102];
int dx1[6]={0,1,-1,1,0,1};
int dx2[6]={-1,0,-1,1,-1,0};
int dy[6]={-1,-1,0,0,1,1};

int rec(int x,int y){
  vis[y][x]=1;
  int res=0;

  for(int i=0;i<6;i++){
    int nx=x+(y%2?dx1[i]:dx2[i]),ny=y+dy[i];
    if(nx<0 || ny<0 || w+1<nx || h+1<ny)continue;
    if(grid[ny][nx])res++;
    if(!vis[ny][nx])res+=rec(nx,ny);
  }

  return res;
}

int main(void){

  cin >> w >> h;
  for(int i=1;i<=h;i++){
    for(int j=1;j<=w;j++){
      cin >> grid[i][j];
      vis[i][j]=grid[i][j];
    }
  }
  cout << rec(0,0) << endl;

  return 0;
}