Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Harder than I thought...

Author: David Dahlem

Date: 09:09:48 02/11/06

Go up one level in this thread


On February 10, 2006 at 07:04:19, h.g.muller wrote:

>This one seems to do it. It took me 70 miniutes, (without cheating or debugger),
>so the other 3 problems better be really easy compared to this one...
>
>int vectors[] = {16,15,17,0,-16,-15,-17,0,1,-1,16,-16,0,
>                 1,-1,16,-16,15,-15,17,-17,0,
>                 14,-14,18,-18,31,-31,33,-33,0};
>int firstdir[] = {2,-1,3,21,12,16,7,12};
>
>char board[128];
>int orig, targ;
>
>int negamax(int color, int depth)
>{
>        int origsqr, targsqr, bestorig, besttarg, score, bestscore,
>            piece, piecetype, victim, dirnr, stepvec;
>
>        bestscore = depth<=1 ? 0 : -2;
>
>        for(origsqr=0; origsqr<128; origsqr = (origsqr+9) & ~8)
>        {
>            piece = board[origsqr];
>            piecetype = piece&7;
>            if(piece&color)
>            {
>                dirnr = firstdir[piecetype];
>                while(stepvec = vectors[++dirnr])
>                {
>                    targsqr = origsqr;
>                    do {
>                        targsqr += stepvec;
>                        if(targsqr & 0x88) break;
>                        victim = board[targsqr];
>                        if(victim & color) break;
>                        if(piecetype<3 &&
>                           ( (victim==0) != ((stepvec&7)==0) )
>                          ) break;
>
>                        if((victim&7) == 4) {bestscore = 2; goto cutoff;}
>
>                        if(depth>1)
>                        {
>                            board[origsqr] = 0; board[targsqr] = piece;
>                            score = -negamax(24-color, depth-1);
>                            board[origsqr] = piece; board[targsqr] = victim;
>                            /*printf("%d: (%2x,%2x) %d %d\n", depth, origsqr,
>targsqr, score, bestscore);/**/
>
>                            if(score>bestscore)
>                            {
>                                bestscore = score;
>                                bestorig = origsqr;
>                                besttarg = targsqr;
>                            }
>                        }
>                        victim += (piecetype < 5);
>                    } while(victim==0);
>                }
>            }
>        }
>        if(bestscore == -1)
>            bestscore = -negamax(24-color, 0)/2;
>cutoff:
>        orig = bestorig;
>        targ = besttarg;
>        return bestscore;
>}
>
>int main(void)
>{
>        int i, j, k, s;
>        char buf[80], c;
>
>        for(i=0;i<128;i+=16)
>        {
>            for(j=0;j<8;j++)
>            {   c = getchar();
>                k=8;
>                if(c>='a') {c += 'A'-'a'; k=16;}
>                switch(c)
>                {
>                case 'K': s=4; break;
>                case 'Q': s=7; break;
>                case 'R': s=6; break;
>                case 'B': s=5; break;
>                case 'N': s=3; break;
>                case 'P': s=k==8?1:2; break;
>                case '.': s=0; break;
>                default: printf("bad piece %c at %d,%d\n",c,i,j); exit(0);
>                }
>                if(s) s+= k;
>                board[i+j] = s;
>            }
>            if(getchar() != '\n') {printf("bad format\n"); exit(0);}
>        }
>
>        for(i=2;i<=4;i+=2)
>            if(negamax(8,i+1))
>            {
>                printf("mate in %d by %c%c%c%c\n", i/2,
>                        (orig&7)+'a', (orig>>4)+'1',
>                        (targ&7)+'a', (targ>>4)+'1');
>                exit(0);
>            }
>        printf("no mate found\n");
>}

How do you enter mate-in-1 positions to this program?

Regards
Dave



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.