Author: Robert Hyatt
Date: 08:46:24 02/10/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"); >} Another note. Your above solution would be returned "incorrect". The directions, as given previously, were to print the _position_ after making the mate in 1 move. Not print the move that mates. You would get the assignment returned, marked "incorrect" but they do _not_ tell you why it is wrong. They might say "it crashed" or "the output is incorrect" but that is all you get. That's part of the "fun" of these events. We run them here regularly.
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.