八皇后之递归算法、回溯算法、穷举算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档