// minigo.c version 1.06; by Mathijs Romans
// more readable version on http://www.romansland.nl/minigo
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#define D(x,y) (x>=0&&x<9&&y>=0&&y<9)
#define F for (x=0;x<9;x++) for(y=0;y<9;y++)
#define I for (i=0;i<4;i++) 
#define P printf(
#define R return
#define Z break;
		
int a,b[9][9],j=0,k,l[9][9],m[]={1,0,-1,0,1,1,-1,-1},n[]={0,1,0,-1,1,-1,1,-1},o,p[9][9],q,r,s,t,u,x,y;

int v(int x, int y, int c) {
	int i;
	if (!D(x,y)) R 0;
	if (b[x][y]!=4&&b[x][y]!=5) R 1;
	if (b[x][y]!=c||l[x][y]) R 0;
	l[x][y]=1;
	I if (v(x+m[i],y+n[i],c)) R 1;
	R 0;}

void w(int x, int y) {
	int i;
	if (!D(x,y)||b[x][y]!=(t+1)%2+4) R;
	b[x][y]=0;
	q=x;
	r=y;
	j++;
	I w(x+m[i],y+n[i]);}

void z(int c) {
	int d,e,i;
	F {
		if (b[x][y]>7) b[x][y]-=8;
		if (b[x][y]==0) b[x][y]=2+c;}
	do	{
		d=0;
		F	if (b[x][y]==2+c) {
			I	if (D(x+m[i],y+n[i])&&b[x+m[i]][y+n[i]]!=4+c) goto E;
			e=0;
				I	if (D(x+m[i+4],y+n[i+4])&&(b[x+m[i+4]][y+n[i+4]]==4+c||b[x+m[i+4]][y+n[i+4]]==2+c)) e++;
			if (x==0||x==8) e++;
			if (y==0||y==8) e++;
			if (e<3) {E:d=1;b[x][y]=0;}}}
	while (d);}

int A(int c, int d) {
	int i,f;
	f=b[c][d];
	b[c][d]=t%2+4;
	j=0;
	I	{
		if (D(c+m[i],d+n[i])&&!l[c+m[i]][d+n[i]]&&b[c+m[i]][d+n[i]]==(t+1)%2+4&&!v(c+m[i],d+n[i],(t+1)%2+4))
			w(c+m[i],d+n[i]);
		F l[x][y]=0;}
	i=v(c,d,b[c][d]);
	F l[x][y]=0;
	if (i) {
		o=0;
		z(t%2);		
		if (j==1) {
			b[q][r]+=8;
			I	if (D(c+m[i],d+n[i])&&b[c+m[i]][d+n[i]]==4+t%2) {
				b[q][r]-=8;
				Z}}
		R 1;}
	b[c][d]=f+8;
	R 0;}

int C() {
	int d;
	for (;t<810;t++) {
		d=0;
		F	if (!b[x][y]||b[x][y]==2+(t+1)%2) d++;
		do {
			if (!d) {
				z(t%2);
				if (o) {
					a=0;
					F	if (b[x][y]==4||b[x][y]==2) a++;
					R 2*a-81;}
				o=1;
				Z}
			do {
				a=rand()%9;
				k=rand()%9;
			}
			while (!(!b[a][k]||b[a][k]==2+(t+1)%2));
			if (A(a,k)) Z
			d--;}
		while (1);}
	R 0;}

int main() {
	int c,d,e,f,g,h,i;
	char G[20];
	srand(time(0));
	F	p[x][y]=l[x][y]=0;
	for (u=0;1;u++) {
		if (u%2)
			do {
				t=u;
				f=-1;
				P"YOUR MOVE!\n");
				scanf("%s",G);
				if (G[0]=='p') Z
				f=G[0]-'a';
				g=G[1]-'1';
				if (f>=0&&f<9&&g>=0&&g<9&&b[f][g]<4&&A(f,g)) Z}
			while(1);
		else {
			f=-1;
			for (c=0;c<9;c++)
				for (d=0;d<9;d++)
					if ((!p[c][d]||p[c][d]==3)) {
						t=u;
						F b[x][y]=p[x][y];
						if (A(c,d)) {
							e=0;
							for (i=0;i<1000;i++) {
								F b[x][y]=p[x][y];
								A(c,d);
								t++;
								e+=C();
								t=u;}
							if (f==-1||e>h) {
								f=c;
								g=d;
								h=e;}}}}
		F b[x][y]=p[x][y];
		if (f!=-1) {s=0;A(f,g);}
		else {
			z(t%2);
			P"PASS!\n");
			if (s) {
				t++;
				a=C();
				if (a>0) P"BLACK");
				else P"WHITE");
				P" WINS WITH %i POINTS!\n",a>0?a:-a);
				R 0;}
			s=1;}
		F p[x][y]=b[x][y];
		for (x=0;x<9;x++)
			P"  %c   ",'a'+x);
		P"\n");
		for(y=0;y<9;y++) {
			for(x=0;x<9;x++) {
				switch (b[x][y]) {
					case 4: P" _|_  ");Z
					default: P"  |   ");}}
			P"\n");
			for(x=0;x<9;x++) {
				switch (b[x][y]) {
					case 4: P"/   \\_");Z
					case 5: P"_XXX__");Z
					default: P"__|___");}}
			P" %i\n",y+1);
			for(x=0;x<9;x++) {
				switch (b[x][y]) {
					case 4: P"\\___/ ");Z
					case 5: P" XXX  ");Z
					default: P"  |   ");}}
			P"\n");}
		P"\n");}
	R 0;}
