# BSQを解きたい てすと # 課題 | 項目 | 説明 | | -------- | -------- | | Program name | Column 2 | | Turn in files |Makefile、 それ以外の必要なファイル | | Makefile|Yes| |Arguments |図が記入されているファイル| |External functs.|open, close, read, write, malloc, free, exit| |Libft authorized |No| |Description|与えられた図の中で、 面積が最大の正方形を描け| ## マップ上で最大の正方形を見つけ、障害物を回避する - マップの情報が入ったファイルが提供され、それがプログラムのコマンドライン引数として渡されなければならない。 - マップの最初の行には、マップに関する以下の情報が記載されている。 1. マップ上の行数 2. “empty”の文字 3. “obstacle”の文字 4. “full”の文字 - マップは、“empty”文字、行、“obstacle”文字で構成されている。 - プログラムの目的は、“empty”文字を“full”文字に置き換え、可能な限 り最大の正方形を描くことである。 - 複数の解が存在する場合は、マップの一番上に最も近い正方形を描き、その次に、マップの左に最も近い正方形を描くこと。 - プログラムは、1〜n個のファイルを引数として処理すること。 - プログラムが複数のマップをコマンドライン引数から受け取る場合は、それぞれの解、または、map errorの後に改行すること。 - コマンドライン引数がない場合は、プログラムは標準入力から読み取ること。 - プロジェクトをコンパイルするための有効なMakefileが必要である。 Makefileは、 relinkしないこと。 ## 有効なマップの定義: - すべての行は、同じ長さであること。 - 1つのボックスの行が、少なくとも1つ存在すること。 - 行末に改行があること。 - マップ上の文字は、最初の行で指定された文字のみであること。 - 最初の行に文字がない場合、または、2つの文字(empty, full, obstacle)が 同一の場合、 マップは無効である。 - 文字には、表示可能な任意の文字、数字を使用できる。 - 無効なマップである場合、プログラムは標準エラー出力に改行が続くmap errorを出力すること。 その後、 プログラムは次のマップに進む。 # メモ ## 必要な関数 - struct t_mapの構成要素 int row_len; int col_len; char empty; char obstacle; char full; int **map; - int is_valid_map(char *str); 与えられたマップの文字列が有効か判定する - int **parse_map(char *str); 文字列を解析してマップの2次元配列を作る このとき、障害物は-1, 空は0とする - int solve(t_map map); min{左+1, 上+1, 左上+1}を左上から行ってマップを数値で埋める 戻り値は成功で1、失敗でnull - int create_square(t_map map); solveで埋めたマップから最大値を見つけ、最大の正方形をmapに記述する。このとき、正方形は1で埋める。 mapは(-1:障害物, 0:空, 1:正方形)という3つの値を持つ配列になる。 ただし、複数の解が存在する場合はマップの一番上に最も近い正方形を描き、そ の次に、 マップの左に最も近い正方形を描くこと。 戻り値は成功で1、失敗でnull - void get_answer(t_map square_map); 正方形で埋めたマップを指定された文字に変換する - コマンドライン引数を良い感じに解析する関数 - char *read_map(char *path); パスを読み込んで文字列を取得する ## TODO