- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
情报処理II-wakayama
情報処理Ⅱ 第11回 2004年12月21日(火) 本日学ぶこと:プログラミングの例題3つ 行列式の計算 学ぶこと:配列を含む構造体の利用,再帰呼び出し 「ぷよ連結問題」の再帰的解法 学ぶこと:列挙型の利用,多次元配列を引数とする関数 「ぷよ連結問題」の非再帰的解法 学ぶこと:構造体の利用,配列の写像化 なぜ行列式を必要とするのか? 行列や線形代数は,工学の多くの分野の基礎となる. n行n列の行列Aに関する等価な命題 行列Aが正則 行列Aは逆行列を持つ 行列Aによる線形写像(一次変換)は,n次元の空間全体をそれ自身に移す(全単射となる) 行列式|A|≠0 ?プログラミングできるのでは? 以下では,行数=列数 「n次の正方行列(square matrix)」を扱う. nは処理の中で変わり得る. どのようにして行列式を求めるか? n=1のときは,成分の値が行列式 n=2, 3のときは「たすきがけ」で求められる. n≧4のときは簡単ではないが… 順列と符号から求める. 行列の基本操作で求める. 余因子から求める.?採用! 余因子を用いた行列式の求め方 sqmatrix.cで定義した構造体とその利用方法 typedef struct sqmatrix { int size; double element[5][5]; } sqmatrix; matrix m, *pm = m; sqmatrix.cで定義した関数(1) sqmatrix *init_sqmatrix(sqmatrix *pm, int size) 行列の次数を指定し,各成分の値を0にする. sqmatrix *set_row(sqmatrix *pm, int y, double *vector) 行列の特定の行の値(行ベクトル)を設定する. void print_sqmatrix(sqmatrix *pm, double *det) 行列の内容を出力する. detがNULLでなければ,行列式の値として*detも出力する. sqmatrix.cで定義した関数(2) sqmatrix *remove_row_column(sqmatrix *pm, int y, int x) 指定された行と列を取り除いた行列にする. pmが参照するsqmatrixオブジェクトが書き換えられる. 次数(行数,列数)は1減る. double calc_determinant(sqmatrix *pm) 行列式を求める. 再帰呼び出しを使用している. 次数の小さい行列は,関数内のローカル変数(auto変数)としてオブジェクトが生成される. 実行して確認 ぷよ連結問題 ぷよが配置された2次元空間(フィールド)と,その中の座標を入力に取り,そこと連結する「ぷよ」の個数を求めよ. フィールドの表現(1) フィールドは2次元 ?2次元配列を使用 色は赤?青?黄と空白 ?char型で表現 フィールドの表現(2) しかし… マスに入る値はいろいろあるのでは? 色の番号(数値)は重要か? マスに入る値を列挙型で表現する. enum puyo { P_EMPTY, P_RED, P_BLUE, P_YELLOW, P_GREEN, P_PURPLE, P_OJAMA, P_MAX }; enum puyo型の値(もしくは整数値)が色ぷよか否かは,自作関数is_coloredで判定する. ぷよ連結問題?再帰版(1) 考え方 着目する地点の上下左右に探索を広げる. 連結するぷよの個数は,1+ 「上に伸ばして連結する個数」+ 「下に伸ばして連結する個数」+ 「左に伸ばして連結する個数」+ 「右に伸ばして連結する個数」 探索済の情報を格納しておく. フィールドの値の最上位ビットで 無限ループ回避のため ぷよ連結問題?再帰版(2) 2次元フィールドfieldと,その中の座標(x,y)を入力に取り,そこと色ぷよcolorで連結するぷよの個数calc_puyo(field, x, y, color)は, 座標がフィールド外なら,0 色ぷよでないか,色がcolorと異なっていれば,0 探索済なら,0 以上のいずれでもないなら,そこを探索済とした上で,1+ calc_puyo(field, x, y-1, color)+ calc_puyo(field, x, y+1, color)+ calc_puyo(field, x-1, y, color)+ calc_puyo(field, x+1, y, color) バックトラック 後戻り法ともいう. 木など,枝分かれする対象をすべて探索するのに有用. 再帰呼び出しを使用し,戻る地点の情報をスタックに乗せる. ぷよ連結問題とバックトラック
文档评论(0)