まず、グリッド内の文字の位置は簡単に計算できます。
function get_pos( c : char)
begin
int col ← (c-'A') modulo 4
int row ← (c-'A') div 4
return (row,col)
end
位置 (6,2) と (6,3) を使用できると仮定します
セル座標間の減算を次のように簡単に定義できます。
function subtract( pos1, pos2 : position )
begin
return (pos2.row-pos1.row, pos2.col-pos1.col)
end
減算によってペア (x,y) が得られる場合、パスは単純に文字 'R' の x 倍 (x が正の場合) または x が負の場合 'L' であり、x がゼロの場合は何もない可能性があり、同様に y 倍の文字 'D ' y が正の場合、または y が負の場合は「U」、y がゼロの場合はおそらく何もない場合、文字「E」で終了します。
function print_row_path( pos1, pos2 : position )
begin
path ← subtract(pos1,pos2)
if path.row > 0 then
print_times_char(path.row,'R')
else if path.row < 0
print_times_char(-path.row,'L')
end if
end
function print_col_path( pos1, pos2 : position )
begin
path ← subtract(pos1,pos2)
if path.col > 0 then
print_times_char(path.col,'D')
else if path.col < 0
print_times_char(-path.col,'U')
end if
end
function print_path_direction( pos1, pos2 : position ; first_direction : direction )
begin
if (first_direction = FIRST_MOVE_ROW) then
print_row_path(pos1,pos2)
print_col_path(pos1,pos2)
else
print_col_path(pos1,pos2)
print_row_path(pos1,pos2)
end if
print 'E'
end
function print_path(start, end : char)
begin
position pos1 ← get_pos(start)
position pos2 ← get_pos(end)
print_path_direction(pos1,pos2, FIRST_MOVE_ROW)
end
print_times_char(t,c) は、文字 c の t 倍を出力する関数です。パス印刷の 2 つの「フレーバー」を定義しました。1 つは行の動きを最初に印刷し、もう 1 つは列の動きを最初に印刷します。
位置 (6,2) と (6,3) が禁止されていると仮定します
位置 (6,2) と (6,3) の使用が許可されていない場合:
- 'A' ≤ start,end ≤ 'X' または 'Y' ≤ start,end ≤ 'Z' の場合: (6,2) または (6.3) はパスで使用されません
- if 'A' ≤ start ≤ 'X' and 'Y' ≤ end ≤ 'Z' : 禁止されたセルを使用しないようにするには、最初に列の動きを出力します
- if 'A' ≤ end ≤ 'X' and 'Y' ≤ start ≤ 'Z' : 今回は行の動きを最初に出力する必要があります
擬似コード:
function print_path_wo_forbidden(start, end : char)
begin
position pos1 ← get_pos(start)
position pos2 ← get_pos(end)
if if 'A' ≤ start ≤ 'X' and 'Y' ≤ end ≤ 'Z' then
print_path_direction(pos1,pos2, FIRST_MOVE_COLUMN)
else
print_path_direction(pos1,pos2, FIRST_MOVE_COLUMN)
end if
end
複雑
2 つの位置の間のパスの出力は明らかに O(1) で行われるため、長さ n の文字列の場合、O(n) アルゴリズムを構築できます。