ICPC2009 国内予選

Domestic

B:島はいくつある?

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1160
ICPC2004国内予選B問題のRed and Blackとほとんど同じ。
1であるとこからスタートして探索したところを0にする。

import java.util.Scanner;

public class Domestic2009_B{
	private static final Scanner sc=new Scanner(System.in);
	
	static int[] mx={1,-1,0,0,-1,1,-1,1};
	static int[] my={0,0,1,-1,-1,-1,1,1};
	static int[][] map;
	static int cnt=0;
	static int x;
	static int y;

	static void putMap(){
		for(int i=0;i<y;i++){
			for(int i2=0;i2<x;i2++){
				map[i][i2]=sc.nextInt();
			}
		}
	}

	static int[] sstart(){
		int[] start=new int[2];
		for(int i=0;i<y;i++){
			for(int i2=0;i2<x;i2++){
				if(map[i][i2]==1){
					start[0]=i;
					start[1]=i2;
					return start;
				}else if(i==(y-1) && i2==(x-1)){
					start[0]=-1;
					start[1]=-1;
					return start;
				}
			}
		}
		return start;   //start[0]はy軸, [1]はx軸
	}


	public static void main(String[] args){
		while(true){
			cnt=0;
			x=sc.nextInt();y=sc.nextInt();
			if(x==0 && y==0)break;

			map=new int[y][x];
			putMap();
			
			

			while(true){
				int[] start=sstart();
				if(start[0]==-1 && start[1]==-1)break;
				int sx=start[1];
				int sy=start[0];	
				dfs(sy,sx);
				cnt++;
			}
			
			System.out.println(cnt);
		}
	}


	static int dfs(int sy, int sx){
		if(sy>=y || sx>=x || sy<0 || sx<0)return 0;
		if(map[sy][sx]==0)return 0;
		if(map[sy][sx]==1){
			map[sy][sx]=0;
		}

		for(int i=0;i<8;i++){
			dfs(sy+my[i], sx+mx[i]);
		}
		return 0;
	}
}