|
> No.3698[元記事へ]
問題
下図のような格子状経路の移動を考える。
左下(交差点1)からその右(交差点2)に進み、各交差点を1回のみ通って、
交差点20に進む道順は何通りあるか。
・─・─・─・─・
│ │ │ │ │
・─・─・─・─・
↓ │ │ │ │
20←・─・─・─・
↓ ↑ │ │ │
1→2→・─・─・
考察
四隅は一方通行となる。
・←●─・─○←・
↓ │ │ │ ↑
○─・─・─・─●
↓ │ │ │ │
20←・─・─・─○
↓ ↑ │ │ ↑
1→2→・─●→・
m=4、n=11以降は処理困難となる。
LET M=4 !m行n列 ※交差点の個数
LET N=5
DIM A(M,N)
MAT A=ZER
LET A(M,1)=1 !始点
LET A(M,2)=2
PUBLIC NUMERIC C !場合の数
LET C=0
CALL try(3,M,2, M,N,A)
PRINT C;"通り"
END
EXTERNAL SUB try(P,Y,X, M,N,A(,))
IF Y=M-1 AND X=1 THEN !終点
IF P>M*N THEN
LET C=C+1 !結果を表示する
PRINT "No.";C
MAT PRINT USING REPEAT$(" ##",N): A
END IF
ELSE
DIM B(M,N)
MAT B=A
IF Y>1 AND A(Y-1,X)=0 THEN !上へ
LET B(Y-1,X)=P
CALL try(P+1,Y-1,X, M,N,B)
LET B(Y-1,X)=0
END IF
IF Y<M AND A(Y+1,X)=0 THEN !下へ
LET B(Y+1,X)=P
CALL try(P+1,Y+1,X, M,N,B)
LET B(Y+1,X)=0
END IF
IF X>1 AND A(Y,X-1)=0 THEN !左へ
LET B(Y,X-1)=P
CALL try(P+1,Y,X-1, M,N,B)
LET B(Y,X-1)=0
END IF
IF X<N AND A(Y,X+1)=0 THEN !右へ
LET B(Y,X+1)=P
CALL try(P+1,Y,X+1, M,N,B)
LET B(Y,X+1)=0
END IF
END IF
END SUB
実行結果
No. 1
18 17 16 15 14
19 4 5 12 13
20 3 6 11 10
1 2 7 8 9
No. 2
18 17 16 15 14
19 4 5 6 13
20 3 8 7 12
1 2 9 10 11
No. 3
18 17 14 13 12
19 16 15 10 11
20 3 4 9 8
1 2 5 6 7
No. 4
16 15 14 13 12
17 18 5 6 11
20 19 4 7 10
1 2 3 8 9
No. 5
18 17 16 15 14
19 6 7 8 13
20 5 4 9 12
1 2 3 10 11
No. 6
16 15 14 11 10
17 18 13 12 9
20 19 4 5 8
1 2 3 6 7
No. 7
16 15 14 9 8
17 18 13 10 7
20 19 12 11 6
1 2 3 4 5
No. 8
18 17 16 9 8
19 14 15 10 7
20 13 12 11 6
1 2 3 4 5
No. 9
18 17 10 9 8
19 16 11 12 7
20 15 14 13 6
1 2 3 4 5
No. 10
12 11 10 9 8
13 14 15 16 7
20 19 18 17 6
1 2 3 4 5
No. 11
18 17 12 11 10
19 16 13 8 9
20 15 14 7 6
1 2 3 4 5
No. 12
14 13 12 11 10
15 16 17 8 9
20 19 18 7 6
1 2 3 4 5
No. 13
16 15 14 13 12
17 18 9 10 11
20 19 8 7 6
1 2 3 4 5
No. 14
18 17 16 15 14
19 10 11 12 13
20 9 8 7 6
1 2 3 4 5
14 通り
|
|