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.