Newsgroups: comp.lang.prolog
Path: cantaloupe.srv.cs.cmu.edu!fs7.ece.cmu.edu!europa.eng.gtefsd.com!uhog.mit.edu!bloom-beacon.mit.edu!spool.mu.edu!torn!utnut!utcsri!newsflash.concordia.ca!CC.UMontreal.CA!IRO.UMontreal.CA!tarau
From: tarau@IRO.UMontreal.CA (Paul Tarau)
Subject: Re: N-Queens and Knights Tour Needed
Message-ID: <D0xDF4.KAs@IRO.UMontreal.CA>
Sender: news@IRO.UMontreal.CA
Organization: Universite de Montreal, Canada
References: <3c0o1j$68n@yar.trincoll.edu> <3cpj3u$ikp@prakinf2.PrakInf.TU-Ilmenau.DE>
Date: Fri, 16 Dec 1994 22:35:27 GMT
Lines: 72

In article <3cpj3u$ikp@prakinf2.PrakInf.TU-Ilmenau.DE> knauf@theoinf.tu-ilmenau.de (Dr. Rainer Knauf) writes:

>What's "Knight Tour"? Can anybody explain the problem?
>
It means covering a chess-board with Knight moves. Here is
the one I use for benchmarking purposes from the BinProlog
distribution (on clement.info.umoncton.ca) where you can also
find versions with different data representations.

go:-go(5).

go(N):-
	time(_),
	make_board(N,Board,NbMoves),
	knight(NbMoves,1,1,N,Board),!,
	time(T),
	write(time=T),nl,statistics,show(N,Board).

make_board(N,Board,M):-
	M is N*N,
	functor(Line,line,N),
	findall(Line,range(_,1,N),LBoard),
	Board=..[board|LBoard].

val(I,J,Val,N,Board):-
	I>0,I=<N,J>0,J=<N,
	arg(I,Board,Line),
	arg(J,Line,Val).

knight(0,_,_,_,_) :- !.
knight(K,A,B,N,Board) :-
		K1 is K-1,
		val(A,B,K,N,Board),
		move(Dx,Dy),
		step(K1,A,B,Dx,Dy,N,Board).

step(K1,A,B,Dx,Dy,N,Board):-
    C is A + Dx,
    D is B + Dy,
    knight(K1,C,D,N,Board).

range(Min,Min,Max):-Min=<Max.
range(I,Min,Max):-
        Min<Max,
        Min1 is Min+1,
        range(I,Min1,Max).


show(N,Board):-
	range(I,1,N),
		range(J,1,N),
			val(I,J,V,N,Board),
			write(' '),X is 1-V//10,tab(X),write(V),
			(J=N->nl;true),
	fail.
show(_):-nl.

move( 2, 1).
move( 2,-1).
move(-2, 1).
move(-2,-1).
move( 1, 2).
move(-1, 2).
move( 1,-2).
move(-1,-2).


time(T) :- statistics(runtime,[_,T]).


Paul Tarau

