GAIさんへのお返事です。
先のプログラムは、すべてのパターンの「開始(乱列)→終了(整列)」を調べています。
これを「終了→開始」に変更しました。
いわゆる幅優先探索で、「どこまで手数が増やせるか(最多手数)」ということです。
本問題では「逆の操作」が可能で、完全整列 1,2,3,4,… から交換を始めます。
これでも13枚は、、、
ところで、12枚は65回ですか?
LET t0=TIME
LET N=13 !1~Nのカード
DIM P(N)
FOR i=1 TO N !完全整列 1,2,3,4,…
LET P(i)=i
NEXT i
LET cmax=0 !最多手数
DIM P_sav(N) !その並び
MAT P_sav=P
CALL try(P,N,0,cmax,P_sav)
PRINT "最大の回数=";cmax
MAT PRINT P_sav;
PRINT "計算時間=";TIME-t0
END
EXTERNAL SUB reverse(A(),N) !1~N番目までの並びを逆順にする
FOR i=1 TO INT(N/2) !交換位置は半分まで ※全部すると元に戻る
swap A(i),A(N-i+1) !中央から対称な位置どうし
NEXT i
END SUB
EXTERNAL SUB try(P(),N,c,cmax,P_sav())
DIM W(N)
MAT W=P
FOR i=2 TO N !交換できなくなるまで
MAT P=W
IF P(i)=i THEN !i番目のカードが数字iなら交換可能! ※逆の操作
CALL reverse(P,i) !トップのカードの数字だけカードを抜き出し、順番を逆にして元に戻す
IF c+1>cmax THEN !最大のものを記録する
LET cmax=c+1
MAT P_sav=P
END IF
CALL try(P,N,c+1,cmax,P_sav) !次へ
END IF
NEXT i
END SUB
!WindowsMe、PentiumⅢ700MHz、192MBにて、十進BASIC 2進モードで実行。
!
!最大の回数= 80
! 2 9 4 5 11 12 10 1 8 13 3 6 7
!
!計算時間= 1528.79 ←約25.5分