|
EXAM DRILL 1.0
|
| int main | ( | int | argc, |
| char ** | argv | ||
| ) |
BSQプログラムのエントリポイント
main 関数から各モジュールへの適切な委譲。argc == 1):stdin) に対して solve_single_map() を実行。argc > 1):fopen() でファイルを開き、成功すれば solve_single_map()。ft_error() ("map error")。fclose() で閉じる。| [in] | argc | 引数の数 |
| [in] | argv | 引数の配列 |
| void solve_single_map | ( | FILE * | stream | ) |
単一のマップを処理する
指定されたファイルストリームからマップを読み込み、最大正方形を探索して結果を表示する。
load_map(): ストリームからマップ構造体を生成。ft_error()。find_largest_square(): 最大正方形を探索。print_solution(): 結果を出力。free_map(): メモリ解放。load_map() を呼び出し、戻り値の t_map* を受け取る。NULL の場合、マップエラー ("map error") を出力して関数を終了する (return)。find_largest_square() を呼び出し、解 (t_square) を取得する。print_solution() を呼び出し、解を反映したマップを出力する。free_map() を呼び出し、使用したメモリをクリーンアップする。| [in] | stream | 読み込み元のファイルストリーム (stdin または ファイル) |
| t_map * load_map | ( | FILE * | stream | ) |
マップ全体をロードする
parse_map_header() と read_map_data() を組み合わせて、ストリームから完全なマップ構造体を生成する。
t_map 構造体のメモリを確保し、ゼロ初期化する。getline() で1行目を読み込み、parse_map_header() に渡してメタデータを解析する。read_map_data() を呼び出して残りのデータを読み込む。free_map() 等で解放し、NULL を返す。| [in] | stream | 読み込み元のファイルストリーム |
map_parser.c の 192 行目に定義があります。
| int parse_map_header | ( | char * | first_line, |
| t_map_info * | info | ||
| ) |
マップの最初の行を解析する
最初の行(例: "9.ox" または "9 . o x")から、行数、空き地文字、障害物文字、埋まり文字を抽出する。
full, obstacle, empty の3つの文字を取得する。info 構造体に値を設定し、1 を返す。| [in] | first_line | 解析対象の文字列 |
| [out] | info | 結果を格納する構造体へのポインタ |
map_parser.c の 24 行目に定義があります。
| int read_map_data | ( | FILE * | stream, |
| t_map * | map | ||
| ) |
マップデータを読み込む
ヘッダー以降の行を読み込み、2次元配列としてメモリに格納する。
info->rows) だけループし、getline() で行を読み込む。info->cols として記録する。info->cols と一致するか確認する。不一致ならエラー。malloc() し、文字列をコピーする (strncpy() 等)。empty または obstacle のいずれかであることを確認する。info->rows) 読み込めなければエラー。0 を返す。| [in] | stream | 読み込み元のファイルストリーム |
| [in,out] | map | 情報を格納する t_map 構造体 (rows, chars 設定済み) |
map_parser.c の 114 行目に定義があります。
| void free_map | ( | t_map * | map | ) |
マップのメモリを解放する
t_map 構造体と、そのメンバである2次元配列 data を安全に解放する。
NULL でないか確認する。data が存在すれば、各行 (data[i]) をループで free() する。data) を free() する。map) を free() する。| [in] | map | 解放するマップ構造体へのポインタ |
map_parser.c の 244 行目に定義があります。
動的計画法 (DP) を使用して最大の正方形を見つける
マップを走査し、各地点を右下とする最大正方形のサイズを計算する。
dp[i][j] は、(i, j) を右下角とする正方形の最大サイズを表す。dp[i][j] = 0dp[i][j] = ft_min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1dp テーブル(int**)を行数分確保し、各行を列数分確保する。i=0) と 1列目 (j=0) をスキャン。1、障害物なら 0 を設定。largest_square) を更新する可能性があるためチェックを入れる。i=1, j=1 から開始する二重ループ。0。dp[i][j] が largest_square.size より大きい場合、更新する。size が同じ場合、**「より上、そしてより左」** のものを優先するロジックを実装する。free(): 計算が終わったら dp テーブルを解放する。
| [in] | map | 処理対象のマップ構造体 |
bsq_solver.c の 72 行目に定義があります。
解決策をマップに適用し、結果を出力する
特定された最大の正方形エリアを full 文字で埋め、マップ全体を標準出力に書き出す。
size == 0)、マップをそのまま出力して終了。(i, j) が正方形の範囲内にあるか判定する。square.y <= i < square.y + square.sizesquare.x <= j < square.x + square.sizefull 文字を出力。| [in] | map | マップ構造体 |
| [in] | square | 適用する正方形の情報 |
bsq_solver.c の 210 行目に定義があります。
| void ft_putstr_fd | ( | const char * | s, |
| int | fd | ||
| ) |
| void ft_error | ( | const char * | msg | ) |