Hi Ed,
I found that the player to move first will lose in the 2x3 game,
regardless of whether players are "obliged" to complete squares
when they're able to. With a corner square of value 2, player A
will lose by 3 squares. With a corner square of value 2, player A
will lose by 1 square.
Ok, here's what I've found:
box = 2: player 2 will win, regardless of the first 3 moves
box = 2: If players have to make boxes when they are able to, then
there are only 3 combinations of opening moves that will result in a
victory for the first player (if optimal play is used after the first
two moves). The first two moves must be two of the three edges shown
here:
+ + + +
2
+ ++ +

+ + + +
There is also a unique situation that happens when these are the opening
two moves:
+ + + +
2
+ + + +

+ + ++
In this situation, player one will lose by three boxes if optimal play
is
used from this point forward (in all other combinations of first two
moves,
player one loses by 1 box).
If players don't have to make boxes when they are able to (in the 2
game),
then there are 38 combinations of opening moves that allow the first
player
to win.
#include
#define SPECIAL_BOX (2)
#define FORCE
int result[131072];
void process(int j, int& best, int prev_score=0)
{
// All positions filled.
if(j==0x1ffff) { if(prev_score > best) best=prev_score; return; }
int sector[6];
int score;
#ifdef FORCE
bool force = false;
sector[0] = j&0x609;
sector[1] = j&0xc12;
sector[2] = j&0x1824;
sector[3] = j&0x6048;
sector[4] = j&0xc090;
sector[5] = j&0x18120;
if((sector[0]==0x608  sector[0]==0x601  sector[0]==0x409 
sector[0]==0x209) 
(sector[1]==0xc10  sector[1]==0xc02  sector[1]==0x812 
sector[1]==0x412) 
(sector[2]==0x1820  sector[2]==0x1804  sector[2]==0x1024 
sector[2]==0x824) 
(sector[3]==0x6040  sector[3]==0x6008  sector[3]==0x2048 
sector[3]==0x4048) 
(sector[4]==0xc080  sector[4]==0xc010  sector[4]==0x8090 
sector[4]==0x4090) 
(sector[5]==0x18100  sector[5]==0x18020  sector[5]==0x10120 
sector[5]==0x8120))
force = true;
#endif
for(int x=0; x<17; ++x) {
if(j&(1< best) best = the_score;
}
else {
process(j(1<=0; i) {
for(int j=0; j<131072; ++j) {
jcomp=0;
for(int k=0; k<17; ++k) { jcomp += (j&(1<