TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2008年2月9日 星期六

Assignment review: N queens in Prolog

/*
Generate a list [1, 2, ..., N] to L.
Permute L to Board.
Check Board if it is safe.
*/

queens( N, Board ) :- !,
                      range( N, L ),
                      permutation( L, Board ),
                      safe( Board ).

range( N, L ) :- decrease( N, Temp ),
                 reverse( Temp, L ).                                             % Generate a increasing list.
decrease( 0, [] ) :- !.
decrease( N, [H | L] ) :- N = H,
                              Next is N - 1,
                              decrease( Next, L ).

safe( [_] ) :- !.                                                                % Check if all queens are safe.
safe( [Queen | Others] ) :- !,
                            nohit( Queen, 1, Others ),
                            safe( Others ).
nohit( _, _, [] ) :- !.                                                          % Check if queens could not attack each other.
nohit( Column, Row_D, [Queen | Others] ) :- !,
                                            nohit( Column, Row_D, Queen ),
                                            Row_D_Next is Row_D + 1,
                                            nohit( Column, Row_D_Next, Others ).
nohit( Column, Row_D, Target ) :- !,
                                  Diag1 is Column + Row_D,
                                  Diag1 =\= Target,
                                  Diag2 is Column - Row_D,
                                  Diag2 =\= Target.

之後只要用queens( 4, B ).就可以列出當棋盤大小為四佾時,四個皇后不會互相攻擊的縱座標或橫座標[?]
以四佾來說,它會印出:
B = [2,4,1,3]
B = [3,1,4,2]
意即第一組解為(1,2)(2,4)(3,1)(4,3)和第二組解為(1,3)(2,1)(3,4)(4,2)。
引數的數字可以依棋盤大小任意更改。由於Prolog是採DFS的方式搜尋,太大的棋盤會跑很久。

沒有留言:

張貼留言