Author: Gerd Isenberg
Date: 16:10:27 09/09/02
Go up one level in this thread
On September 09, 2002 at 18:52:05, Steffan Westcott wrote: >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... aha, sure. Luck that the bit 63 is mostly cleared in my program before shifting :-) > >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 ----- Wow, Steffan, thats absolutely great. Exactly what i was looking for. "flood fill" algorithm. Thanks a lot. regards, Gerd
This page took 0 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.