//thanks to
//why does this code
not count 42 unique products?
#include <stdio.h>
#include <winbgim.h>
struct
move
{
int
marker; // this will always be 0 or 1, depending on which of the two markers is
being moved
int
digit; // this will be a number, 0-11, indicating which of the 12 binomials the
marker is being move to
};
struct
gamestate
{
int
movenumber; //this will be 0 for the first move, 1
for the second, and so on
int
board[7][6]; //each entry contains 0 for X, 1 for 0, 2 for vacant
int
markers[2];//markers[0] contains the number of the binomial the first marker is
on; markers[1] has the other
};
struct
binomial
{
int
a, b;
};
struct
polynomial
{
int
a, b, c;
};
void populate(struct
binomial array[]);
void populatePoly(struct polynomial parray[7][6], struct binomial barray[]);
void setBoard(struct binomial barray[], struct polynomial parray[7][6]);
struct
polynomial multiply(struct binomial x, struct binomial y);
int
polyEquals(struct
polynomial x, struct polynomial y);
int
in(struct polynomial x, struct
polynomial array[7][6]);
void printPoly(int x, int y, struct
polynomial z);
void printBi(int x, int y, struct
binomial z);
int
main()
{
struct
binomial bi[12];
struct
polynomial poly[7][6];
populate(bi);
populatePoly(poly, bi);
setBoard(bi, poly);
//outtextxy(100,100,"does this work?");
getch();
return 0;
}
void setBoard(struct binomial barray[], struct polynomial parray[7][6])
{
initwindow(600,800);
int
i, j, x=5, y=50;
setcolor(WHITE);
for (i = 1; i <= 7; i++)
line(0,100*i,600,100*i);
for (i = 1; i < 6; i++)
line(100*i,0,100*i,800);
line(0,750,600,750);
for (i = 0; i < 7; i++)
for (j = 0; j <
6; j++)
{
printPoly(x, y, parray[i][j]);
if ( x < 500
)
x = x+100;
else
{
x = 5;
y = y+100;
}
}
for (i = 0; i < 6; i++)
printBi((100*i)+30,720, barray[i]);
for (i=0; i < 6; i++)
printBi((100*i)+30,770, barray[i+6]);
}
void printPoly(int x, int y, struct
polynomial z)
{
char string[10];
sprintf(string,"%dx2 + %dx + %d",z.a, z.b, z.c);
outtextxy(x,y,string);
}
void printBi(int x, int y, struct
binomial z)
{
char string[10];
sprintf(string,"%dx + %d",z.a, z.b);
outtextxy(x,y,string);
}
struct
polynomial multiply(struct binomial x, struct binomial y)
{
struct
polynomial temp;
temp.a = x.a*y.a;
temp.b = x.a*y.b + x.b*y.a;
temp.c = x.b*y.b;
return temp;
}
int
polyEquals(struct
polynomial x, struct polynomial y)
{
return (x.a == y.a && x.b == y.b && x.c == y.c);
}
void populate(struct
binomial array[])
{
array[0].a= -2;
array[0].b= -1;
array[1].a= -2;
array[1].b= 1;
array[2].a= -1;
array[2].b= -2;
array[3].a= -1;
array[3].b= -1;
array[4].a= -1;
array[4].b= 1;
array[5].a= -1;
array[5].b= 2;
array[6].a= 1;
array[6].b= -2;
array[7].a= 1;
array[7].b= -1;
array[8].a= 1;
array[8].b= 1;
array[9].a= 1;
array[9].b= 2;
array[10].a= 2;
array[10].b= -1;
array[11].a= 2;
array[11].b= 1;
}
void populatePoly(struct polynomial parray[7][6], struct binomial barray[])
{
int
i, j,m=0,n=0;
struct
polynomial k;
int
count=0;
for (i = 0; i < 12; i++)
for (j = i; j < 12; j++)
{
k = multiply(barray[i],barray[j]);
if (!in(k, parray))
{
count++;
printf("count is %d\n",count);
parray[m][n] = k;
if (n < 6)
n++;
else
{
n = 0;
m++;
}
}
}
printf("count at end is %d\n",count);
parray[6][4].a = parray[6][4].b = parray[6][4].c = 0;
parray[6][5].a = parray[6][5].b = parray[6][5].c = 0;
}
int
in(struct polynomial x, struct
polynomial array[7][6])
{
int
i, j;
printf("checking %dx2+%dx+%d\n",x.a,x.b,x.c);
for (i = 0; i < 7; i++)
for (j = 0; j <
6; j++)
if (polyEquals(x, array[i][j]))
{
printf("already there\n");
return 1;
}
return 0;
}