八皇后之递归算法、回溯算法、穷举算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VAR
CONT,I:INTEGER;
A:ARRAY[1..N] OF BYTE;{存放正确的一组解}
C:ARRAY[1..N] OF BOOLEAN;{存放某一列放皇后的情况,用于判断是否有同列的情况}
L:ARRAY[1-N..N-1] OF BOOLEAN;{存放某一斜线上放皇后的情况,用于判断是否有同斜线的情况;斜线的方向为\}
R:ARRAY[2..2*N] OF BOOLEAN;{存放某一斜线上放皇后的情况,用于判断是否有同斜线的情况;斜线的方向为/}
PROCEDURE PR;
VAR
I:INTEGER;
BEGIN
FOR I:=1 TO N DO WRITE(A[I]:4);
INC(CONT);
WRITELN(' CONT=',CONT);
END;
PROCEDURE TRY(I:INTEGER);
VAR
J:INTEGER;
PROCEDURE ERASE(I:INTEGER);
BEGIN
C[J]:=TRUE;
L[I-J]:=TRUE;
R[I+J]:=TRUE;
END;
BEGIN
FOR J:=1 TO N DO
IF C[J] AND L[I-J] AND R[I+J] THEN
BEGIN
A[I]:=J;
C[J]:=FALSE;
L[I-J]:=FALSE;
R[I+J]:=FALSE;
IF I ERASE(I); END; END; END; BEGIN FOR I:=1 TO N DO C[I]:=TRUE; FOR I:=1-N TO N-1 DO L[I]:=TRUE; FOR I:=2 TO 2*N DO R[I]:=TRUE; CONT:=0; I:=1; TRY(I); WRITELN; WRITELN('PROGRAM END.'); READLN; END. PROGRAM HUANGHOU(INPUT,OUTPUT);{回溯算法} CONST N=8; VAR K:INTEGER; X:ARRAY[1..N] OF INTEGER; FUNCTION PLACE(K:INTEGER):BOOLEAN; VAR I:INTEGER; BEGIN I:=1; WHILE I BEGIN IF (ABS(X[I]-X[K])=ABS(I-K)) OR (X[I]=X[K]) THEN BEGIN PLACE:=FALSE; EXIT; END; I:=I+1; END; PLACE:=TRUE; END; PROCEDURE PRN; VAR I:INTEGER; BEGIN FOR I:=1 TO N DO WRITE(X[I]:4); WRITELN; END; PROCEDURE NQUEENS(N:INTEGER); BEGIN X[1]:=0; K:=1; WHILE K>0 DO BEGIN X[K]:=X[K]+1; WHILE ((X[K]<=N) AND (NOT PLACE(K))) DO X[K]:=X[K]+1; IF X[K]<=N THEN BEGIN IF K=N THEN PRN ELSE BEGIN K:=K+1; X[K]:=0; END; END ELSE K:=K-1; END; END; BEGIN NQUEENS(N); READLN; END. PROGRAM BHH(INPUT,OUTPUT);{穷举算法:最好理解,但效率最低} CONST N=8; VAR I1,I2,I3,I4,I5,I6,I7,I8:INTEGER; X:ARRAY [1..N] OF INTEGER; PROCEDURE PRINT;{输出正确的解} VAR I:INTEGER; BEGIN WRITELN; END; FUNCTION CHECK():BOOLEAN; VAR A,B:INTEGER; BEGIN FOR A:=2 TO N DO BEGIN FOR B:=1 TO A-1 DO BEGIN IF (ABS(X[A]-X[B])=ABS(A-B)) OR (X[A]=X[B]) THEN BEGIN CHECK:=FALSE; EXIT; END; END; END; CHECK:=TRUE; END; BEGIN FOR I1:=1 TO N DO FOR I2:=1 TO N DO FOR I3:=1 TO N DO FOR I4:=1 TO N DO FOR I5:=1 TO N DO FOR I6:=1 TO N DO FOR I7:=1 TO N DO