トップ 一覧 Farm 検索 ヘルプ 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);
 }