ACM/ICPC


2004Bの問題


回答者:ほへい

解法:移動できるかどうかの総当たり
   『移動先がマップの範囲内で'.'なら移動』『移動後、そのマスを'@'に変える』

所要時間:90分。再帰とマス移動は得意な方に任せます。

速度:データセット瞬殺。

実行環境:PenM 1.6GHz 512M Win2000


#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);
           }
       }
   }
}

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-21 (木) 11:25:35 (1612d)