座標位置(0,0)から出発し,右へ1cm,上に2cm,右へ3cm移動する。
以降1cmずつ距離を増やし,方向は必ず90度ずつ変更する。(0,0)に戻って来るには最短で合計何cmになるか。
幅優先の探索。深さ優先で一定数で打ち切っても良い。
問題は距離だけを求めるようになっているが,経路も出力したいので,経路も記録する。
int trace[100]; // 方向を記録する(1:右,2:左,3:上,4:下)
trace[ ]のINDEXは距離を使う。
探索の肝となる部分は以下のようにする。
void find( int ix, int iy, int dist) { if( ix == 0 && iy == 0) { (0,0)に戻ってきた,経路発見 } if( trace[dist-1] == 3 || trace[dist-1] == 4) { trace[dist] = 1; find( ix + dist, iy, dist+1);} // 直角に曲がる if( trace[dist-1] == 3 || trace[dist-1] == 4) { trace[dist] = 2; find( ix - dist, iy, dist+1);} if( trace[dist-1] == 1 || trace[dist-1] == 2) { trace[dist] = 3; find( ix, iy + dist, dist+1);} if( trace[dist-1] == 1 || trace[dist-1] == 2) { trace[dist] = 4; find( ix, iy - dist, dist+1);} }
(ix,iy)は直前の位置,distは次に進む距離を示す。
経路は4件出力される。
解速度
即