プログラム仕様書のダウンロード

数理工学コース第 14回プログラムコンテスト
効率的な施肥問題 使用関数リスト
作成者:小笠原翔太 ([email protected])
1. 概要
本レポートは、
“効率的な施肥問題”のプラットフォーム"platform.c",”cpu.c”およびヘッ
ダファイル"base.h" に記述されている定数,構造体,列挙型の定義やディレクティブ,グ
ローバル変数の説明および関数群の解説を行う.
これらの内容は演習問題の解答およびコンテスト用のプログラムにて各自自由に利用し
てよい. (ただし, 内容の書き換えは行わないこと. )
2. マクロ変数
define 文で指定された文字列は特定の用途を持ち,コンパイルの前に定数値に置き換えら
れる. ヘッダファイル内で定義されているマクロ変数は以下の通り.
・MAP_SIZE:盤面のサイズ
・SEED:乱数の種
・TARGET_NUMBER:一度の my_solution 関数呼び出しで可能な投下選択数の上限
・FINISHED, UNFINISHED:終了条件判定に利用
・VALID, INVALID:投下選択の妥当性判定に利用
3. ユーザ定義型変数の型
列挙型変数は, 取り得る値に特定の意味を持たせる場合に定義する変数である. 実際のプ
ログラム上では整数型 int と同じ動作を行い, 定義された順に 0, 1, 2, ...という値を持つ.
(以下の trw_type 型の例では, cross=0, concave=1, square=2 となる. )
ヘッダファイル内で定義されているユーザ定義型変数の型は以下の通り.
・trw_type 型… 投下型(列挙型={cross, concave, square})
cross… 十字型
concave… 凹型
square… 四角形
・trw_drct 型… 投下方向(列挙型={up, down, right, left})
up… 上向き
down… 下向き
right… 右向き
left… 左向き
・THROW_TARGET 型… 投下先選択肢(構造体={int x, int y, trw_type type, trw_drct
drct)
x… x 座標
y… y 座標
type… 投下型
drct… 投下方向
4. グローバル変数
グローバル変数は全てのスコープからアクセスできる変数.多くの関数に使用される変数
に対して引数として渡すことを避けるために使用.
・FTR_OUT:MAP 外の肥料消費を記録.
・init_trgt:投下選択の初期値.my_trgt[0]に代入され,デフォルトの選択となる.
・null_trgt:投下選択の初期値.my_trgt[1]-[TARGET_NUMBER]に代入され,無効な選
択を表す.
5. 関数リスト
platform.c に記述されている関数群は以下の通り.ゲーム進行に用いられる.
・int is_finished(int MAP[MAP_SIZE][MAP_SIZE])
入力
盤面 MAP
出力
配列内に正の値があれば 0(UNFINISHED),なければ 1(FINISHED)を出力.
・void display_map(int MAP[MAP_SIZE][MAP_SIZE])
入力
盤面 MAP
手続き
盤面 MAP を表示.
・void display_map_r(char *filename, int MAP[MAP_SIZE][MAP_SIZE])
入力
記録用ファイル名 filename,盤面 MAP
手続き
盤面 MAP を記録用ファイルに追記.
・void show_ftr_use(int MAP[MAP_SIZE][MAP_SIZE])
入力
現在の盤面 MAP
手続き
グローバル変数 FRT_EDGE の値とマップ上の負値の絶対値の総和を表示.
・void show_ftr_use_r(char *filename, int MAP[MAP_SIZE][MAP_SIZE])
入力
記録用ファイル名 filename,現在の盤面 MAP
手続き
グローバル変数 FRT_EDGE の値とマップ上の負値の絶対値の総和を記録用ファ
イルに追記.
・void generate_map(int MAP[MAP_SIZE][MAP_SIZE])
入力
入力配列 MAP
手続き
マップを次の方法で生成して MAP に代入.1.ロード2.手動生成3.乱数で自
動生成.乱数の種 SEED は base.h で定義.
生成したマップはバイナリファイル(***.bin)で保存可能.
・void t_process(int x, int y, int MAP[MAP_SIZE][MAP_SIZE])
入力
投下座標 x, y
投下先の盤面 MAP
手続き
座標(x,y)がマップ外なら FTR_EDGE を 1 増やし,マップ内なら MAP[x][y]の
値を 1 減らす.
・void put_cross(int MAP[MAP_SIZE][MAP_SIZE], THROW_TARGET trgt)
入力
投下先の盤面 MAP
投下情報 trgt
手続き
t_process を用いて十字型に肥料投下処理を行う.
(*)put_concave, put_square は同様に凹型,四角形の肥料投下処理を行う.
・int is_valid_decision(THROW_TARGET trgt)
入力
投下情報 trgt
出力
trgt の type および drct の値が正当であれば VALID=1,不当であれば INVALID=0
を返す.
・void update_map(int MAP[MAP_SIZE][MAP_SIZE], THROW_TARGET trgt)
入力
盤面 MAP
投下情報 trgt
手続き
盤面 MAP に trgt に従って肥料投下処理を反映させる.
・ void
decide_spot
(char
*file_name,
int
MAP
[MAP_SIZE][MAP_SIZE],
THROW_TARGET trgt[TARGET_NUMBER])
入力
実行ファイル名 file_name
現在の盤面 MAP
投下選択入力用配列 trgt
手続き
main 関数実行時の第一引数が man であればユーザの入力処理を,cpu であれば
別途コンパイルした実行ファイルを用いて投下選択を行わせ,trgt 配列に選択情
報を記録させる.
この際,外部にバイナリ形式の一時ファイル(mapinfo.tmp)を作成し,cpu との仲
介を行う.
・void decide_spot_r(char *filename,THROW_TARGET trgt)
入力
記録用ファイル名 filename
投下情報 trgt
手続き
記録用ファイルに投下選択の情報を出力する.
・int is_same_struct(THROW_TARGET trgt1, THROW_TARGET trgt2)
入力
投下情報 trgt1,trgt2
出力
trgt1 と trgt2 の内容がすべて一致すれば 1 を,一致しなければ 0 を出力する.
・void refresh_trgt(THROW_TARGET trgt[TARGET_NUMBER])
入力
投下情報配列 trgt
手続き
trgt[0] に init_trgt を , trgt[1] , trgt[2] , … , trgt[TARGET_NUMBER-1] に
null_trgt を代入する.
cpu.c には platform.c の refresh_trgt と同じ関数が記述されているので,こちらは sample.c
や kadai*.c 内から直接呼出して利用可能.