DECLARE EXTERNAL SUB combi
PUBLIC NUMERIC k,n,h,pt,count
LET t0=TIME
LET k=5 ! 行数
LET n=k*(k+1)/2 ! 最大値
LET h=INT(k/2) ! 半分
LET pt=MOD(k,2) ! 奇偶
DIM nn(n-1),c(k-1)
MAT nn=ZER
LET count=0
LET j=0
CALL combi(nn,1,k-1,j,c)
PRINT TIME-t0;"秒",count;"回"
END
EXTERNAL SUB differ(p()) !注意:一部改良しました
DIM a(k,k),ck(n-1)
LET a(1,1)=n
FOR j=2 TO k
LET a(1,j)=p(j-1)
NEXT j
CALL check
FOR j=2 TO h
SWAP a(1,j-1),a(1,j)
CALL check
NEXT j
IF pt=1 AND p(1)<p(k-1) THEN ! nが中央のとき
SWAP a(1,h),a(1,h+1)
CALL check
END IF
SUB check
LET count=count+1
MAT ck=ZER
FOR r=1 TO k-1
LET ck(p(r))=1
NEXT r
FOR ii=1 TO k-1
FOR jj=1 TO k-ii
LET d=ABS(a(ii,jj)-a(ii,jj+1))
IF ck(d)=1 THEN EXIT SUB ! 数値重複
LET ck(d)=1
LET a(ii+1,jj)=d
NEXT jj
NEXT ii
MAT PRINT a; ! 解あり
END SUB
END SUB
REM 十進BASIC添付"\BASICw32\SAMPLE\COMBINAT.BAS"より
REM 1~n-1の集合からr個を選ぶ組合せを生成する。
EXTERNAL SUB combi(nn(),kk,r,j,c())
DECLARE EXTERNAL SUB permu
! kk以降の数からr個を選択する
IF r=0 THEN
FOR i=1 TO n-1
IF nn(i)=1 THEN
LET j=j+1
LET c(j)=i
END IF
NEXT i
!MAT PRINT c;
CALL permu(c,1)
LET j=0
ELSE
FOR i=kk TO n-r
LET nn(i)=1
CALL combi(nn,i+1,r-1,j,c)
LET nn(i)=0
NEXT i
END IF
END SUB
REM 十進BASIC添付"\BASICw32\SAMPLE\PERMUTAT.BAS"より
REM (k-1)個の数値の順列を辞書式順序で生成する。
EXTERNAL SUB permu(p(),r)
DECLARE EXTERNAL SUB differ
IF r=k-1 THEN
!MAT PRINT p;
CALL differ(p)
ELSE
FOR i=r TO k-1
LET t=p(i)
FOR j=i-1 TO r STEP -1
LET p(j+1)=p(j)
NEXT j
LET p(r)=t
CALL permu(p,r+1)
LET t=p(r)
FOR j=r TO i-1
LET p(j)=p(j+1)
NEXT j
LET p(i)=t
NEXT i
END IF
END SUB
助けて下さい。
投稿日:2008年11月16日(日)20時54分54秒k=5 でやっていますが、朝から動かしていますがまだ終わりません。(12時間近く。)
せめて、1時間位で調査できないものでしょうか?
どこをどう改良したらよいのか・・・、誰か助け舟が欲しい!!!