/* pent.c -- find pentomino solutions */ /* Copyright (C) 2002 Grant P. Maizels, Sydney, Australia. */ /* All Rights Reserved. */ #include /* Board */ typedef unsigned long long ull; int x, y; /* Board Dimensions */ ull brd; /* board 64bit */ ull tries; /* move count */ int found; int pp; /* pieces placed */ int por[12]; /* piece orientaion */ char *let; /* letter representation */ /* Valid Moves on Board */ ull vmap[12][60*8]; /* only first vmcnt[i] of each vmap[i] are used */ int vmcnt[12]; /* Count of valid maps for piece */ int drops[12]; /* Count of maps dropped for symetry */ int dropv[12]; /* Count of maps dropeed for voids with spaces not a multiple of 5 */ int bit(); ull mirrorh(); ull mirrorv(); void trymap(); /* 5x5 Representations of pieces */ long pm[12]; /* piece map */ long opm[12][8]; /* oriented piece map */ char vopm[12]; /* valid oriented piece map */ long rot90(), rev(); int bit_25(); void prnt_status(); void show_map(); void show_vmap(); main(argc, argv) int argc; char **argv; { char *optim = ""; if(argc <= 1) x = 10; else x = atoi(argv[1]); if(x < 3 || x > 20 || 60%x != 0) { fprintf(stderr, "BAD x value %d\n", x); exit(1); } #ifdef CHKVD optim = " optim = CHKVD"; #endif printf("%s: %d x %d%s\n\n", argv[0], x, 60/x, optim); init(); prnt_status(); game(); } game(){ brd = 0; pp = 0; move(0); printf("DONE %d found %ld tries\n", found, tries); } move(x) int x; { ull sve; int i; if(pp == 12) { show_map(); return; } for(i=0; i= x || mpy < 0 || mpy >= y)) { return; } if (b == 1) map |= ((ull)1)<<(mpx+mpy*x); } /* Symetry check for piece 0 only */ if(pce == 0) { for(i=0; i= 0 && bit(i-x,*mp)==0&&bit(i-x,*vmp)==0) chkpos(i-x, mp, vmp, z+1, "^"); /* process left */ if(i%x>0 && bit(i-1,*mp)==0&&bit(i-1,*vmp)==0) chkpos(i-1, mp, vmp, z+1, "<"); /* process right */ if((i+1)%x>0 && bit(i+1,*mp)==0&&bit(i+1,*vmp)==0) chkpos(i+1, mp, vmp, z+1, ">"); /* process down */ if(i+x < 60 && bit(i+x,*mp)==0&&bit(i+x,*vmp)==0) chkpos(i+x, mp, vmp, z+1, "v"); } int bitcnt(m) ull m; { int c = 0; ull u; u = (ull) m; for(c=0; u!=0; u>>=((ull)1)) if(u&((ull)1)) c++; return c; } ull mirrorv(m) ull m; { ull r = 0; int j; for(j=0;j<60;j++) { if(bit((j/x)*x+x-1-j%x, m)) r = r|(((ull)1)<