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