トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

2004db1.c

// 2004国内予選 問題B

#include <stdio.h>

#define N 30

//再帰呼び出しも用いた探索
void search(int room[N][N], int w, int h, int x, int y, int *ct)
{
	int i;
	
	if(x<0 || x>=w || y<0 || y>=h || room[x][y]==1){
		return;
	}
	
	//printf("(%d,%d)\n", x, y);
	
	(*ct)++;
	room[x][y]=1;
	search(room, w, h, x-1, y, ct);
	search(room, w, h, x, y-1, ct);
	search(room, w, h, x+1, y, ct);
	search(room, w, h, x, y+1, ct);	
}

int main(void)
{
	int w,h,x,y,sx,sy,ct;
	int room[N][N];
	char line[N];
	
	while(1){
		fgets(line, N, stdin);
		sscanf(line, "%d %d", &w, &h);
		//printf("%d %d ", w, h);
		if(w==0 && h==0) break;
		
		for(y=0; y<h; y++){
			fgets(line, N, stdin);
			//printf("%d %s\n", y, line);
			for(x=0; x<w; x++){
				if(line[x]=='.'){
					room[x][y]=0;
				}else if(line[x]=='#'){
					room[x][y]=1;
				}else if(line[x]=='@'){
					room[x][y]=0;
					sx=x; sy=y;   // 最初の位置
				}
			}
		}
		
		//printf("sx=%d, sy=%d\n", sx, sy);
		
		/*
		// データ確認
		for(y=0; y<h; y++){
			for(x=0; x<w; x++){
				printf("%d", room[x][y]);
			}
			printf("\n");
		}
		*/
		
		ct=0;
		search(room, w, h, sx, sy, &ct);
		
		printf("%d\n", ct);
	}
	
	return(0);
}