Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 1
#define C 0
typedef int bstate_t[2][2];
struct seenlist_t {
struct seenlist_t *next;
bstate_t datum;
}*seenlist=NULL;
int showmoves(int n,bstate_t *m){
int z=0;
while(n){
printf("%d:%d, ",(*m)[z][M],(*m)[z][C]);
*m++;n--;
}
printf("\n");
return 1;
}
int acceptable(bstate_t bstate){
struct seenlist_t **sl = &seenlist;
//*
for(;*sl;sl = &(*sl)->next){
// if ((*sl)->datum == bstate) return 0;
if (!memcmp((*sl)->datum,&bstate,sizeof(bstate))) return 0;
}
*sl = malloc(sizeof(struct seenlist_t));
(*sl)->next = NULL;memcpy((*sl)->datum,&bstate,sizeof(bstate));
//*/
return ((bstate[0][M] >= bstate[0][C] || !bstate[0][M]) && (bstate[1][M] >= bstate[1][C] || !bstate[0][M]))
&& !(bstate[0][M] < 0 || bstate[1][M] < 0 || bstate[0][C] < 0 || bstate[1][C] < 0);
}
int findmoves(int num,bstate_t *m,int side,int mm,int mc){
bstate_t *newm;
if (num >=20) return 0;
if ((m[num-1][1][M] == m[num-1][1][C]) && (m[num-1][1][M] == 0))
printf("solved!! %d %d %d\n",num,m[num-1][1][M],m[num-1][1][C]);
newm = malloc((1+num) * sizeof(bstate_t));
memcpy(newm,m,num * sizeof(*m));
memcpy(newm+num,newm+num-1,sizeof(bstate_t));
newm[num][0][M] += mm;newm[num][0][C] += mc;
newm[num][1][M] -= mm;newm[num][1][C] -= mc;
if (acceptable(newm[num])){
printf("***:%2d,%d ",num,9);showmoves(num,newm);
if (side % 2){
printf("-%d-",side);
findmoves(num+1,newm,side+1,-1,-1);
findmoves(num+1,newm,side+1,0,-1);
findmoves(num+1,newm,side+1,-1,0);
} else {
printf(".%d.",side);
findmoves(num+1,newm,side+1,1,1);
findmoves(num+1,newm,side+1,0,1);
findmoves(num+1,newm,side+1,1,0);
}
}
free(newm);
return 1;
}
int main(int argc, char **argv){
bstate_t bank= {{0,0},{3,3}};
printf("%d, %d\n",bank[0][M],sizeof(short));
findmoves(1,&bank,1,1,1);
return 0;
}
It supposidly does a depthfirst search for the solution.. meh