国民党陈荃原型:在n*n棋盘上设置n个后,是其不互相攻击?

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/06 04:41:34
呵呵,我对这个问题很是不明白,求助各位,小弟在次谢过~!~!

经典是8皇后问题,答案是72。

N皇后问题

N皇后问题要求在NN的棋盘上放置N个皇后,使其不能互相攻击,即任意2个皇后不能处于棋盘上的同一行、同一列或同一斜线上。以下程序用回溯法求出所有满足要求的皇后布局数。其中PLACE用于检测当前位置处的皇后与已放置的皇后是否互相攻击。BACKTRACK实施回溯搜索。

DECLARE SUB BACKTRACK ()

DECLARE SUB PLACE (k!)

REM program nqueen

COMMON SHARED n, ok, answer, x()

DIM x(20)

INPUT "n=", n

answer = 0

FOR i = 1 TO 20

x(i) = 0: NEXT i

CALL BACKTRACK

PRINT " answer is ", answer

END

SUB BACKTRACK

x(1) = 0

k = 1

WHILE [16]

x(k) = x(k) + 1

ok = 0

WHILE (x(k) <= n) AND (ok = 0)

CALL PLACE(k)

IF ok = 0 THEN [17]

WEND

IF x(k) <= n THEN

IF [18] THEN answer = answer + 1 ELSE k = k + 1: x(k) = 0

ELSE [19]

END IF

WEND

END SUB

SUB PLACE (k)

ok = 1

FOR j = 1 TO k - 1

IF (ABS(k - j) = ABS(x(j) - x(k))) OR (x(j) = x(k)) THEN j = k - 1: [20]

NEXT j

END SUB

N皇后问题

N皇后问题要求在NN的棋盘上放置N个皇后,使其不能互相攻击,即任意2个皇后不能处于棋盘上的同一行、同一列或同一斜线上。以下程序用回溯法求出所有满足要求的皇后布局数。其中PLACE用于检测当前位置处的皇后与已放置的皇后是否互相攻击。BACKTRACK实施回溯搜索。

DECLARE SUB BACKTRACK ()

DECLARE SUB PLACE (k!)

REM program nqueen

COMMON SHARED n, ok, answer, x()

DIM x(20)

INPUT "n=", n

answer = 0

FOR i = 1 TO 20

x(i) = 0: NEXT i

CALL BACKTRACK

PRINT " answer is ", answer

END

SUB BACKTRACK

x(1) = 0

k = 1

WHILE [16]

x(k) = x(k) + 1

ok = 0

WHILE (x(k) <= n) AND (ok = 0)

CALL PLACE(k)

IF ok = 0 THEN [17]

WEND

IF x(k) <= n THEN

IF [18] THEN answer = answer + 1 ELSE k = k + 1: x(k) = 0

ELSE [19]

END IF

WEND

END SUB

SUB PLACE (k)

ok = 1

FOR j = 1 TO k - 1

IF (ABS(k - j) = ABS(x(j) - x(k))) OR (x(j) = x(k)) THEN j = k - 1: [20]

NEXT j

END SUB