[[ACM/ICPC]]&br;
&br;
&br;
[[2004Bの問題:http://www.acm-japan.org/past-icpc/domestic2004/B.jp/B.html]]&br;
&br;
&br;
回答者:[[ほへい]]&br;
&br;
解法:移動できるかどうかの総当たり&br;
   『移動先がマップの範囲内で'.'なら移動』『移動後、そのマスを'@'に変える』&br;
&br;
所要時間:90分。再帰とマス移動は得意な方に任せます。&br;
&br;
速度:データセット瞬殺。&br;
&br;
実行環境:PenM 1.6GHz  512M  Win2000&br;
&br;
&br;


 #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