Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: algorithm question

Author: Vincent Diepeveen

Date: 15:41:26 09/09/02

Go up one level in this thread


On September 09, 2002 at 18:39:51, Vincent Diepeveen wrote:

>On September 09, 2002 at 16:13:00, Gerd Isenberg wrote:
>
>Hello,
>
>Just to be clear is the next path a legal one:
> isconnected(d4,d8) ==>
>  d4 e3 d1 c1 b2 a3 a4 a5 b6 c6 d6 e6 f7 e8 d8

I meant ofcourse:
d4 e3 f2 e1 d1 c1 b2 a3 a4 a5 b6 c6 d6 e6 f7 e8 d8

>In short you want something like the internet is doing if i understand
>well?
>
>
>
>>Hi all,
>>specially algorithm freaks,
>>
>>I'm currently looking for an efficient algorithm to determine whether two bits
>>in a bitboard are connected by "ones". Actually i use following recursive one,
>>but isn't there something smarter?
>>
>>
>>bool isConnected(BitBoard &theBB, int from, int to)
>>{
>> BitBoard adjacentBB = KingAttacks(from) & theBB;
>> theBB &= ~adjacentBB;
>> while (adjacentBB)
>> {
>>  int sq = findLSBAndReset(adjacentBB);
>>  if (sq == to) return true;
>>  if ( isConnected(theBB, sq, to) ) return true;
>> }
>> return false;
>>}
>>
>>
>>One, but not the only source for my interest, is this position posted by allan
>>johnson:
>>
>>[D]B7/p1p5/kb1p4/p3p3/P1N2p2/6p1/7p/K7 w - - 0 1
>>
>>http://www.talkchess.com/forums/1/message.html?250804
>>
>>
>>Thanks in advance,
>>Gerd
>>
>>
>>
>>
>>// MSC example - copy, paste and try
>>
>>#include <stdio.h>
>>
>>typedef __int64 BitBoard;
>>
>>BitBoard sKingAtta[64];
>>
>>#define LOWBOARD(bb) (*((int*)&(bb)))
>>#define HIGHBOARD(bb) (*(((int*)&(bb))+1))
>>
>>__forceinline int findLSBAndReset(BitBoard &bb)
>>{
>> register BitBoard lsbb = bb & (-bb);
>> bb ^= lsbb;
>> int lsb = LOWBOARD(lsbb) | HIGHBOARD(lsbb);
>> return ((((((((((HIGHBOARD(lsbb)!=0) <<1)
>>               ^((lsb & 0xffff0000)!=0))<<1)
>>               ^((lsb & 0xff00ff00)!=0))<<1)
>>               ^((lsb & 0xf0f0f0f0)!=0))<<1)
>>               ^((lsb & 0xcccccccc)!=0))<<1)
>>               ^((lsb & 0xaaaaaaaa)!=0);
>>}
>>
>>int n;
>>
>>bool isConnected(BitBoard &theBB, int from, int to)
>>{
>> if (n++ == 0 ) printf(" n fr to\n");
>> printf("%02d %02d %02d\n", n, from, to);
>> BitBoard adjacentBB = sKingAtta[from] & theBB;
>> theBB &= ~adjacentBB;
>> while (adjacentBB)
>> {
>>  int sq = findLSBAndReset(adjacentBB);
>>  if (sq == to) return true;
>>  if ( isConnected(theBB, sq, to) ) return true;
>> }
>> return false;
>>}
>>
>>// to initialize the king attack array
>>void InitC3Atta (BitBoard AttackArray[64], BitBoard FromC3)
>>{
>> for (int file = 0; file < 8; ++file)
>> {
>>  BitBoard Atta = FromC3;
>>  for (int f = file; f < 2; ++f)
>>   Atta = (Atta>>1) & ~0x8080808080808080;
>>  for (f = 2; f < file; ++f)
>>   Atta = (Atta<<1) & ~0x0101010101010101;
>>  for (int rank = 0; rank < 8; ++rank)
>>  {
>>   int square = file + (rank << 3);
>>   AttackArray[square] = Atta;
>>   for (int r = rank; r < 2; ++r)
>>    AttackArray[square] >>= 8;
>>   for (r = 2; r < rank; ++r)
>>    AttackArray[square] <<= 8;
>>  }
>> }
>>}
>>
>>/*
>>some testbitboards (a0 is lsb)
>>0 1 1 1 1 1 1 1  fe
>>0 0 0 1 1 1 1 1  f8
>>0 0 0 0 1 1 1 1  f0
>>0 0 0 0 0 1 1 1  e0
>>0 0 0 0 0 0 1 1  c0
>>1 1 1 1 0 0 0 1  8f
>>1 1 1 1 1 0 1 0  5f (1f)
>>1 1 1 1 1 1 0 1  bf
>>
>>1 1 1 1 1 1 1 1  ff
>>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 0 1  ff
>>*/
>>
>>
>>BitBoard test1 = 0xfef8f0e0c08f5fbf;
>>//BitBoard test1 = 0xfef8f0e0c08f1fbf; // no connection
>>BitBoard test2 = 0xff01ff80ff0181ff;
>>
>>
>>int main()
>>{
>> InitC3Atta (sKingAtta, 0x0e0a0e00); // king attacks from c3
>>
>> BitBoard traverse = test1;
>> n = 0;
>> if (isConnected (traverse, 0, 57) )
>>  printf("a1 b8 is connected\n\n");
>> else
>>  printf("a1 b8 is not connected\n\n");
>>
>> traverse = test1;
>> n = 0;
>> if (isConnected (traverse, 57, 0) )
>>  printf("b8 a1 is connected\n\n");
>> else
>>  printf("b8 a1 is not connected\n\n");
>>
>> traverse = test2;
>> n = 0;
>> if (isConnected (traverse, 15, 63) )
>>  printf("h2 h8 is connected\n\n");
>> else
>>  printf("h2 h8 is not connected\n\n");
>> traverse = test2;
>> n = 0;
>> if (isConnected (traverse, 63, 15) )
>>  printf("h8 h2 is connected\n\n");
>> else
>>  printf("h8 h2 is not connected\n\n");
>>
>> getchar();
>> return 0;
>>}



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.