GAIさんへのお返事です。
「横切る」や「同一」の判定は、図形が表示されるので、それを見て確認してください。
!散歩コースの探索
PUBLIC NUMERIC N !歩数
LET N=16
DIM d(N),x(0 TO N),y(0 TO N) !各歩数での方向と位置
MAT d=ZER
MAT x=ZER !原点
MAT y=ZER
LET x(1)=1 !1歩目は東へ ※0:東、1:北、2:西、3:南
CALL search(2,d,x,y) !2歩目以降
END
EXTERNAL SUB search(s,d(),x(),y()) !バックトラックで検索する
FOR i=-1 TO 1 STEP 2 !右と左のみ
LET dd=MOD(d(s-1)+i,4) !1つ前を基準にする
LET xx=x(s-1) !現在の位置
LET yy=y(s-1)
SELECT CASE dd !s歩目の移動距離
CASE 0 !E
LET xx=xx+s
CASE 1 !N
LET yy=yy+s
CASE 2 !W
LET xx=xx-s
CASE 3 !S
LET yy=yy-s
CASE ELSE
END SELECT
LET x(s)=xx !進める
LET y(s)=yy
LET d(s)=dd !s歩目の方向
IF s=N THEN !指定の歩数に達したら
IF x(N)=x(0) AND y(N)=y(0) THEN !元の位置に戻ったら
MAT PRINT d;
SET bitmap SIZE 600,600 !作画して交差などを確認する
SET WINDOW -40,40,-40,40
CLEAR
DRAW grid(5,5)
SET LINE width 2
SET TEXT HEIGHT 1.5 !※調整が必要である
SET TEXT JUSTIFY "center","half"
FOR k=1 TO N
SET LINE COLOR 1 !奇数と偶数で色分け
IF MOD(k,2)=0 THEN SET LINE COLOR 4
PLOT LINES: x(k-1),y(k-1); x(k),y(k) !軌跡
PLOT TEXT ,AT (x(k-1)+2*x(k))/3,(y(k-1)+2*y(k))/3: STR$(k)
NEXT k
SET LINE width 1 !restore it
pause !OK?
!INPUT PROMPT "OKかNGを入力してください。": y$
END IF
ELSE
CALL search(s+1,d,x,y) !次へ
END IF
NEXT i
END SUB
!回答、情報、アルゴリズム、パズル
!1歩目を東(水平方向)へ固定すると
!奇数目は水平方向(東西方向)、偶数目は垂直方向(南北方向)になる。
!式で表現すると
! x=±1±3±5±7
! y=±2±4±6±8
!プラスマイナスの組合せで0になるかどうかの検証になる。