Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: algorithm question

Author: Gerd Isenberg

Date: 14:47:11 09/10/02

Go up one level in this thread


On September 10, 2002 at 17:39:33, Gerd Isenberg wrote:

>On September 10, 2002 at 15:50:32, Sune Fischer wrote:
>
>>On September 10, 2002 at 15:32:04, Gerd Isenberg wrote:
>>
>>>On September 10, 2002 at 03:11:41, Sune Fischer wrote:
>>>
>>>>On September 10, 2002 at 03:06:48, Gerd Isenberg wrote:
>>>>
>>>>>Thanks, Tony
>>>>>
>>>>>i have it now. It's a floodfill algorithm.
>>>>>
>>>>>Gerd
>>>>
>>>>I wonder if it is possible to optimize it by running the squares against each
>>>>other to meet at half way?
>>>>Doesn't seem doable though, if we mask the squares onto the same board we can do
>>>>both operations in one go, but then there is no way to check for contact:(
>>>>
>>>>-S.
>>>
>>>With Steffans flood filler its possible to "unroll" the loop, and alternately
>>>let sq2 growing along the path. But that only gains performance, if the path is
>>>disconnected near sq2.
>>
>>yes, and looks like it loses if the path is disconnected near the middle or
>>closer to sq1.
>>
>>-S.
>
>negligible,

oups, only if the squares are connected of course.
otherwise factor two in worst case.
But you can win more than two in other cases,
like factor 28, hmmm...

>but if you fill this one from h2 to h8, it saves 28 iterations :-)
>
>1 1 1 1 1 1 0 1  bf
>1 0 0 0 0 0 0 0  01
>1 1 1 1 1 1 1 1  ff
>0 0 0 0 0 0 0 1  80
>1 1 1 1 1 1 1 1  ff
>1 0 0 0 0 0 0 0  01
>1 0 0 0 0 0 0 1  81
>1 1 1 1 1 1 1 1  ff
>
>Gerd
>
>
>
>>>Approx. 3-4 times faster than my dumb recursive one!
>>>Nice to debug, looking for the growing sq1 iteration for iteration.
>>>
>>>
>>>// SquaresAreConnected by Steffan Westcott slightly modified
>>>//  due to parameter and "unrolled" loop
>>>//==========================================================
>>>bool isConnected2(BitBoard path, int from, int to)
>>>{
>>>    BitBoard sq1, sq2;
>>>    sq1 = scBBOfBit[from];
>>>    sq2 = scBBOfBit[to];
>>>
>>>    // 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
>>>                        // may be skipped here if we assume from!=to in Path
>>>    while(1)
>>>    {
>>>        register 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 & sq2)   return true;             // Found a good path
>>>        if (sq1 == temp) return false;            // Fill has stopped
>>>        // alternatly fill with sq2
>>>        temp = sq2;
>>>        sq2 |= ShiftLeft(sq2) | ShiftRight(sq2);  // Set all 8 neighbours
>>>        sq2 |= ShiftDown(sq2) | ShiftUp(sq2);
>>>        sq2 &= path;                              // Drop bits not in path
>>>        if (sq1 & sq2)   return true;             // Found a good path
>>>        if (sq2 == temp) return false;            // Fill has stopped
>>>    }
>>>}
>>>
>>>cheers,
>>>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.