|
> No.3365[元記事へ]
> 問題
> 8個の数 1,1,2,2,3,3,…,4,4 をうまく一列に並べると、
> 1≦n≦4を満たす全ての自然数nに対して、
> 2つのnの間には(n-1)個の数があるようにすることが出来ることを示してください。
> 類題
> 1~8の数字の書かれたカードがある。
> 2枚ずつペアを作り、カードの数字の差がそれぞれ1,2,3,4になるような組合わせを求めよ。
参考サイト
お茶の時間
クイズ&パズル
差が4の場合
xが空きとすると、4通りの位置に置ける
12345678←位置
4xxx4xxx
x4xxx4xx
xx4xxx4x
xxx4xxx4
より、
1から2nまでの数を扱うので、計算量O( (2n)!/(n-1)! )
LET t0=TIME
LET N=4
PUBLIC NUMERIC C !解の個数
LET C=0
DIM F(2*N) !数字1~2n
MAT F=ZER
CALL try(N, N,F) !差がn,…,3,2,1 ※N+1
IF C=0 THEN PRINT "解なし"
PRINT TIME-t0
END
EXTERNAL SUB try(P, N,F()) !バックトラック法で検索する
FOR i=1 TO 2*N-P !未使用の数字が候補である
IF F(i)=0 AND F(i+P)=0 THEN !組(i,i+p)は条件を満たす
LET F(i)=P !使用中 ※P-1
LET F(i+P)=P !※P-1
IF P=1 THEN !すべて並んだなら ※2
LET C=C+1
PRINT "No.";C
MAT PRINT F;
FOR s=1 TO N !差が1~nの順に
FOR x=1 TO 2*N
IF F(x)=s THEN
PRINT "(";x;",";x+s;") "; !ペア
EXIT FOR
END IF
NEXT x
NEXT s
PRINT
ELSE
CALL try(P-1, N,F) !次へ
END IF
LET F(i)=0 !元に戻す
LET F(i+P)=0
END IF
NEXT i
END SUB
実行結果
No. 1
4 2 3 2 4 3 1 1
( 7 , 8 ) ( 2 , 4 ) ( 3 , 6 ) ( 1 , 5 )
No. 2
4 1 1 3 4 2 3 2
( 2 , 3 ) ( 6 , 8 ) ( 4 , 7 ) ( 1 , 5 )
No. 3
3 4 2 3 2 4 1 1
( 7 , 8 ) ( 3 , 5 ) ( 1 , 4 ) ( 2 , 6 )
No. 4
1 1 4 2 3 2 4 3
( 1 , 2 ) ( 4 , 6 ) ( 5 , 8 ) ( 3 , 7 )
No. 5
2 3 2 4 3 1 1 4
( 6 , 7 ) ( 1 , 3 ) ( 2 , 5 ) ( 4 , 8 )
No. 6
1 1 3 4 2 3 2 4
( 1 , 2 ) ( 5 , 7 ) ( 3 , 6 ) ( 4 , 8 )
|
|