及时当勉励
分类:
2010-04-19 00:02:39
TO QUEEN ;著名的8皇后问题
DRAW HT MAKE "A ARRAY 9 ;定义数组
PR TIME ;输出开始的时间
MAKE "N 0 ;开始时设定解的总数为0
MAKE "BZ 0 ;设定标志=1时获得正确的解
FOR "A1 1 8[FOR "A2 1 8[FOR "A3 1 8[FOR "A4 1 8[FOR "A5 1 8[FOR "A6 1 8[FOR "A7 1 8[FOR "A8 1 8[JC]]]]]]]]
PR TIME ;输出结束的时间
END
TO JC ;检测程序段
ASET :A 1 :A1 ASET :A 2 :A2 ASET :A 3 :A3 ASET :A 4 :A4
ASET :A 5 :A5 ASET :A 6 :A6 ASET :A 7 :A7 ASET :A 8 :A8 ;读出组合出的棋子排列
FOR "L 1 7[FOR "M :L+1 8[IF (AGET :A :L)=(AGET :A :M) THEN[GO "NEXT_]]] ;排除重复数字(排除纵横冲突)
MAKE "BZ 0
FOR "I 1 7[FOR "J :I+1 8[PDD :I :J IF :BZ=1 GO "NEXT_]] ;循环检验对角线是否冲突
IF :BZ=0 THEN PRI ;调用输出答案的过程
LABEL "NEXT_
END
TO PDD :I :J ;判对角线上是否有冲突断程序段
IF (:I+AGET :A :I)=(:J+AGET :A :J) THEN[MAKE "BZ 1] ;发现从右上到左下对角线冲突
IF (:I-AGET :A :I)=(:J-AGET :A :J) THEN[MAKE "BZ 1] ;发现从左上到右下对角线冲突
END
TO PRI ;以文本方式输出棋盘排列
MAKE "N :N+1 ;解的总数增加1
TYPE :N TYPE[=] ;TYPE TIME TYPE[=]
FOR "K 1 8[TYPE AGET :A :K TYPE CHAR 32]PR[] ;画出皇后棋子
END