2004Bの解答
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[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);
}
}
}
}
終了行:
[[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);
}
}
}
}
ページ名: