2010年11月14日日曜日

TopCoder 練習 Islands(SRM 477 Div1 Easy)

Islands(SRM 477 Div1 Easy)

■問題
六角セルのフィールドが与えられる.各セルはWaterかLandである.WaterセルとLandセルに挟まれたBeachの合計長は幾らか.

■解法
あるセルに隣接するセルは6つあるので,各セルの右,右下,左下を調べれば良い.

  1. public class Islands{  
  2.  public int beachLength(String[] str){  
  3.   int ret=0;  
  4.   // j:even (i+1,j), (i,j+1), (i-1,j+1)  
  5.   // j:odd (i+1,j), (i+1,j+1), (i,j+1)  
  6.   int n=str.length;  
  7.   int m=str[0].length();  
  8.   for(int j=0;j<n;j++){  
  9.    for(int i=0;i<m;i++){  
  10.     int[] dx, dy;  
  11.     if(j%2==0){  
  12.      dx=new int[]{1,0,-1};  
  13.      dy=new int[]{0,1,1};  
  14.     }else{  
  15.      dx=new int[]{1,1,0};  
  16.      dy=new int[]{0,1,1};  
  17.     }  
  18.     for(int d=0;d<3;d++){  
  19.      int x=i+dx[d];  
  20.      int y=j+dy[d];  
  21.      if(0<=x&x<m&&0<=y&&y<n&&str[j].charAt(i)!=str[y].charAt(x)){  
  22.       ret++;  
  23.      }  
  24.     }  
  25.    }  
  26.   }  
  27.   return ret;  
  28.  }  
  29. }  

0 件のコメント: