Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: algorithm question

Author: Ron Murawski

Date: 19:22:13 09/09/02

Go up one level in this thread


On September 09, 2002 at 19:10:27, Gerd Isenberg wrote:

>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


Flood fill is a very efficient maze-solver. And that is what you are trying to
solve -- a maze that may have zero or more "correct" paths and may contain
loops.

Ron



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.