Author: Steffan Westcott
Date: 15:52:05 09/09/02
Go up one level in this thread
Hi Gerd, You could use a "flood fill" algorithm, like the one below, starting at the "from" square and stopping if the fill hits the "to" square or the fill can't make any more progress. The fill progresses in all directions at once, so should return an answer within a few iterations. Each iteration is pretty fast too, as it just a bunch of shifting and logic operations. And no lookup tables either :) Please note the warning about making BitBoard unsigned... Cheers, Steffan ----- CUT HERE ----- // NB MUST BE UNSIGNED (for >> to work ok) typedef unsigned __int64 BitBoard; BitBoard ShiftRight(BitBoard b) { return (b<<1) & 0xfefefefefefefefe; } BitBoard ShiftLeft(BitBoard b) { return (b>>1) & 0x7f7f7f7f7f7f7f7f; } BitBoard ShiftUp(BitBoard b) { return b<<8; } BitBoard ShiftDown(BitBoard b) { return b>>8; } ///////////////////////////////////////////////////////////////////////// // // Returns true if a path of set bits in 'path' exists that 8-way connect // any set bit in sq1 to any set bit of sq2 bool SquaresAreConnected(BitBoard sq1, BitBoard sq2, BitBoard path) { // With bitboard sq1, do an 8-way flood fill, masking off bits not in // path at every step. Stop when fill reaches any set bit in sq2, or // fill cannot progress any further if (!(sq1 &= path) || !(sq2 &= path)) return false; // Drop bits not in path // Early exit if sq1 or sq2 not on any path while(1) { if (sq1 & sq2) return true; // Found a good path BitBoard temp = sq1; sq1 |= ShiftLeft(sq1) | ShiftRight(sq1); // Set all 8 neighbours sq1 |= ShiftDown(sq1) | ShiftUp(sq1); sq1 &= path; // Drop bits not in path if (sq1 == temp) return false; // Fill has stopped } } ----- CUT HERE -----
This page took 0.01 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.