ACM/ICPC #include <stdio.h> int width, height; char field[20][20]; FILE *fp_in, *fp_out; char *f_source = "2004B_in.txt"; char *f_answer = "2004B_out.txt"; int answer; void setField(int*); void getAnswer(int*); void move(int i, int j, int*); int main(void) { int current[2]; fp_in = fopen(f_source, "r"); fp_out = fopen(f_answer, "w"); while(1) { fscanf(fp_in, "%d", &width); fscanf(fp_in, "%d", &height); if(width == 0 && height == 0) break; setField(current); answer = 1; getAnswer(current); fprintf(fp_out, "%d\n", answer); } fclose(fp_in); fclose(fp_out); return 0; } void setField(int *current) { int i, j; for(i = 0; i < height; i++) { for(j = 0; j < width; j++) { while(1) { fscanf(fp_in, " %c", &field[i][j]); if(field[i][j] != '\n') break; } if(field[i][j] == '@') { current[0] = i; current[1] = j; } } } } void getAnswer(int *current) { move(1, 0, current); move(-1, 0, current); move(0, 1, current); move(0, -1, current); } void move(int i, int j, int *current) { int temp[2]; if(current[0] + i >= 0 && current[0] + i < height) { if(current[1] + j >= 0 && current[1] + j < width) { if(field[current[0] + i][current[1] + j]== '.') { answer++; field[current[0] + i][current[1] + j] = '@'; temp[0] = current[0] + i; temp[1] = current[1] + j; getAnswer(temp); } } } } |