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

2004db2.c

// 2004国内予選 問題B
//再帰を使わない

#include <stdio.h>

#define N 32
#define TRUE  1
#define FALSE 0

void print(int room[N][N], int w, int h)
{
	int x,y;
	
	for(y=0; y<=h+1; y++){
		for(x=0; x<=w+1; x++){
			printf("%d ", room[x][y]);
		}
		printf("\n");
	}
}

int main(void)
{
	int w, h, x, y, ct, flag;
	int room[N][N];
	char line[N];
	
	while(1){
		fgets(line, N, stdin);
		sscanf(line, "%d %d", &w, &h);
		printf("%d %d\n", w, h);
		if(w==0 && h==0) break;
		
		//上下左右にダミー用の壁を作っておく
		for(x=0; x<=w+1; x++){
			room[x][0]=room[x][h+1]=1;
		}
		for(y=0; y<=h+1; y++){
			room[0][y]=room[w+1][y]=1;
		}
		for(y=1; y<=h; y++){
			fgets(line, N, stdin);
			//printf("%d %s\n", y, line);
			for(x=1; x<=w; x++){
				if(line[x-1]=='.'){
					room[x][y]=0;
				}else if(line[x-1]=='#'){
					room[x][y]=1;
				}else if(line[x-1]=='@'){
					room[x][y]=3;
				}
			}
		}
		
		//print(room,w,h);
		
		// .(0)上下左右に@(3)があったら、その点を@(3)にする
		// この操作を永久に繰り返し、変更が無くなったら終了
		ct=1;
		while(1){
			flag=FALSE;
			for(y=1; y<=h; y++){
				for(x=1; x<=w; x++){
					if(room[x][y]==0){
						if(room[x-1][y]==3||room[x+1][y]==3||
							room[x][y-1]==3||room[x][y+1]==3){
								room[x][y]=3;
								flag=TRUE;
								ct++;
							}
					}
				}
			}
			if(!flag) break;
		}
		
		//print(room,w,h);
		
		printf("%d\n", ct);
	}
	
	return(0);
}