- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
// 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);
}