#include <iostream>
#include <string>
using namespace std;
#define countof( arr ) ( sizeof arr / sizeof *arr )
#define CSTR
#define _____
#define rigid constexpr
using i32 = int;
using u32 = unsigned int;
//---------------------------------------------------------------------------------------
union EVENT
{
u32 data;
struct
{
u32 se : 3, s : 3, sw : 3;
u32 e : 3, w : 3;
u32 ne : 3, n : 3, nw : 3;
u32 y : 3, x : 3, t : 2;
};
CSTR EVENT() : data( 0 ) {}
CSTR EVENT( const i32 value ) : data( value ) {}
CSTR EVENT( const u32 stone, const u32 x, const u32 y )
: t( stone ), x( x ), y( y ) { data &= 0xF0000000; }
std::string to_string()
{
char temp[12];
sprintf( temp, "%11o", data );
return temp;
}
auto score()
{
return (u32)se + s + sw + e + w + ne + n + nw;
}
auto is_valid()
{
return ( data & 0xFFFFFF ) > 0;
}
};
rigid u32 othello_length = 8;
_____ EVENT history[ othello_length * othello_length - 4 ];
//---------------------------------------------------------------------------------------
enum class CELL : u32
{
empty,
black,
white,
wall,
};
enum class MODE : u32
{
valid,
eval,
action,
};
class BOARD
{
private:
CELL board[ othello_length + 2 ][ othello_length + 2 ];
void put_( const u32 x, const u32 y, const CELL stone )
{
board[ y + 1 ][ x + 1 ] = stone;
}
public:
auto get( const u32 x, const u32 y ) const
{
return board[ y + 1 ][ x + 1 ];
}
template< MODE M >
EVENT put( const u32 x, const u32 y, const CELL stone )
{
EVENT event( (u32)stone, x, y );
if( board[ y + 1 ][ x + 1 ] != CELL::empty )
return event;
const CELL opposite =
static_cast< CELL >( (int)stone ^ (int)CELL::wall );
typedef struct DIRECTION
{
i32 x, y;
}
DIRECTION;
rigid DIRECTION directions[]
{
{ -1, -1 }, { +0, -1 }, { +1, -1 },
{ -1, +0 }, { +1, +0 },
{ -1, +1 }, { +0, +1 }, { +1, +1 },
};
for( u32 i = 0; i < countof( directions ); ++i )
{
const DIRECTION d = directions[ i ];
u32 count = 0;
while( ++count, get( x + count * d.x, y + count * d.y ) == opposite );
if( get( x + count * d.x, y + count * d.y ) == stone && count > 1 )
{
event.data |= ( count - 1 ) << ( 7 * 3 - i * 3 );
if( M == MODE::valid )
break;
if( M == MODE::action )
for( u32 c = 1; c < count; ++c )
put_( x + c * d.x, y + c * d.y, stone );
}
}
if( M == MODE::action && event.is_valid() )
{
put_( x, y, stone );
// add to history
}
return event;
}
CSTR BOARD()
{
for( u32 x = 0; x < othello_length + 2; ++x )
board[ 0 ][ x ] = CELL::wall;
for( u32 y = 1; y < othello_length + 1; ++y )
{
board[ y ][ 0 ] = CELL::wall;
for( u32 x = 1; x < othello_length + 1; ++x )
board[ y ][ x ] = CELL::empty;
board[ y ][ othello_length + 1 ] = CELL::wall;
}
for( u32 x = 0; x < othello_length + 2; ++x )
board[ othello_length + 1 ][ x ] = CELL::wall;
put_( 3, 3, CELL::black );
put_( 4, 4, CELL::black );
put_( 3, 4, CELL::white );
put_( 4, 3, CELL::white );
}
friend std::ostream& operator<<( std::ostream& os, const BOARD& b )
{
const std::string tile[] = { "·", "○", "●", "▨" };
for( u32 y = 0; y < othello_length + 2; ++y )
{
for( u32 x = 0; x < othello_length + 2; ++x )
os << tile[ (int)b.board[ y ][ x ] ];
os << std::endl;
}
return os;
}
};
//---------------------------------------------------------------------------------------
#include <sstream>
int main()
{
std::istringstream cin_( "53 52 42 32 22 54 55 23 62 " );
BOARD board;
CELL turn = CELL::black;
while( 1 )
{
cout << board << endl;
int x, y, i;
cin_ >> i;
x = i / 10;
y = i % 10;
if( cin_.eof() )
break;
EVENT event = board.put< MODE::action >( x, y, turn );
cout << event.to_string() << " " << event.score() << endl;
turn = static_cast< CELL >( (u32)turn ^ (u32)CELL::wall );
}
getchar();
return 0;
}
//---------------------------------------------------------------------------------------
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBjb3VudG9mKCBhcnIgKSAgKCBzaXplb2YgYXJyIC8gc2l6ZW9mICphcnIgKQojZGVmaW5lIENTVFIKI2RlZmluZSBfX19fXwojZGVmaW5lIHJpZ2lkICAgICAgIGNvbnN0ZXhwcgoKdXNpbmcgICBpMzIgPSBpbnQ7CnVzaW5nICAgdTMyID0gdW5zaWduZWQgaW50OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnVuaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlQKewogICAgICAgIHUzMiAgICAgICAgIGRhdGE7CiAgICBzdHJ1Y3QKICAgIHsKICAgICAgICB1MzIgICAgICAgICBzZSAgOiAzLCAgICBzICAgOiAzLCAgICBzdyAgOiAzOwogICAgICAgIHUzMiAgICAgICAgIGUgICA6IDMsICAgICAgICAgICAgICAgIHcgICA6IDM7CiAgICAgICAgdTMyICAgICAgICAgbmUgIDogMywgICAgbiAgIDogMywgICAgbncgIDogMzsKCiAgICAgICAgdTMyICAgICAgICAgeSAgIDogMywgICAgeCAgIDogMywgICAgdCAgIDogMjsKICAgIH07CgogICAgQ1NUUiAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UKCkgOiBkYXRhKCAwICkge30KICAgIENTVFIgICAgICAgICAgICAgICAgICAgICAgICBFVkVOVCggY29uc3QgaTMyIHZhbHVlICkgOiBkYXRhKCB2YWx1ZSApIHt9CiAgICBDU1RSICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlQoIGNvbnN0IHUzMiBzdG9uZSwgY29uc3QgdTMyIHgsIGNvbnN0IHUzMiB5ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHQoIHN0b25lICksIHgoIHggKSwgeSggeSApIHsgZGF0YSAmPSAweEYwMDAwMDAwOyB9CgogICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgIHRvX3N0cmluZygpCiAgICB7CiAgICAgICAgY2hhciAgICB0ZW1wWzEyXTsKICAgICAgICBzcHJpbnRmKCB0ZW1wLCAiJTExbyIsIGRhdGEgKTsKICAgICAgICByZXR1cm4gIHRlbXA7CiAgICB9CgogICAgYXV0byAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlKCkKICAgIHsKICAgICAgICByZXR1cm4gICh1MzIpc2UgKyBzICsgc3cgKyBlICsgdyArIG5lICsgbiArIG53OwogICAgfQoKICAgIGF1dG8gICAgICAgICAgICAgICAgICAgICAgICBpc192YWxpZCgpCiAgICB7CiAgICAgICAgcmV0dXJuICAoIGRhdGEgJiAweEZGRkZGRiApID4gMDsKICAgIH0KfTsKCnJpZ2lkICAgdTMyICAgICBvdGhlbGxvX2xlbmd0aCA9IDg7Cl9fX19fICAgRVZFTlQgICBoaXN0b3J5WyBvdGhlbGxvX2xlbmd0aCAqIG90aGVsbG9fbGVuZ3RoIC0gNCBdOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmVudW0gICAgY2xhc3MgICAgICAgICAgICAgICAgICAgQ0VMTCAgICA6IHUzMgp7CiAgICBlbXB0eSwKICAgIGJsYWNrLAogICAgd2hpdGUsCiAgICB3YWxsLAp9OwoKZW51bSAgICBjbGFzcyAgICAgICAgICAgICAgICAgICBNT0RFICAgIDogdTMyCnsKICAgIHZhbGlkLAogICAgZXZhbCwKICAgIGFjdGlvbiwKfTsKCmNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9BUkQKewpwcml2YXRlOgogICAgQ0VMTCAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkWyBvdGhlbGxvX2xlbmd0aCArIDIgXVsgb3RoZWxsb19sZW5ndGggKyAyIF07CgogICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIHB1dF8oIGNvbnN0IHUzMiB4LCBjb25zdCB1MzIgeSwgY29uc3QgQ0VMTCBzdG9uZSApCiAgICB7CiAgICAgICAgYm9hcmRbIHkgKyAxIF1bIHggKyAxIF0gPSBzdG9uZTsKICAgIH0KCnB1YmxpYzoKICAgIGF1dG8gICAgICAgICAgICAgICAgICAgICAgICBnZXQoIGNvbnN0IHUzMiB4LCBjb25zdCB1MzIgeSApIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuICBib2FyZFsgeSArIDEgXVsgeCArIDEgXTsKICAgIH0KCiAgICB0ZW1wbGF0ZTwgTU9ERSBNID4KICAgIEVWRU5UICAgICAgICAgICAgICAgICAgICAgICBwdXQoIGNvbnN0IHUzMiB4LCBjb25zdCB1MzIgeSwgY29uc3QgQ0VMTCBzdG9uZSApCiAgICB7CiAgICAgICAgRVZFTlQgICBldmVudCggKHUzMilzdG9uZSwgeCwgeSApOwoKICAgICAgICBpZiggYm9hcmRbIHkgKyAxIF1bIHggKyAxIF0gIT0gQ0VMTDo6ZW1wdHkgKQogICAgICAgICAgICByZXR1cm4gIGV2ZW50OwoKICAgICAgICBjb25zdCAgIENFTEwgICAgb3Bwb3NpdGUgPQogICAgICAgICAgICBzdGF0aWNfY2FzdDwgQ0VMTCA+KCAoaW50KXN0b25lIF4gKGludClDRUxMOjp3YWxsICk7CgogICAgICAgIHR5cGVkZWYgc3RydWN0ICBESVJFQ1RJT04KICAgICAgICB7CiAgICAgICAgICAgIGkzMiB4LCB5OwogICAgICAgIH0KICAgICAgICBESVJFQ1RJT047CiAgICAgICAgcmlnaWQgICBESVJFQ1RJT04gICBkaXJlY3Rpb25zW10KICAgICAgICB7CiAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgKzAsIC0xIH0sIHsgKzEsIC0xIH0sCiAgICAgICAgICAgIHsgLTEsICswIH0sICAgICAgICAgICAgIHsgKzEsICswIH0sCiAgICAgICAgICAgIHsgLTEsICsxIH0sIHsgKzAsICsxIH0sIHsgKzEsICsxIH0sICAgICAgICAgICAgCiAgICAgICAgfTsKCiAgICAgICAgZm9yKCB1MzIgaSA9IDA7IGkgPCBjb3VudG9mKCBkaXJlY3Rpb25zICk7ICsraSApCiAgICAgICAgewogICAgICAgICAgICBjb25zdCAgIERJUkVDVElPTiAgIGQgPSBkaXJlY3Rpb25zWyBpIF07CiAgICAgICAgICAgIHUzMiBjb3VudCA9IDA7CiAgICAgICAgICAgIHdoaWxlKCArK2NvdW50LCBnZXQoIHggKyBjb3VudCAqIGQueCwgeSArIGNvdW50ICogZC55ICkgPT0gb3Bwb3NpdGUgKTsKICAgICAgICAgICAgaWYoIGdldCggeCArIGNvdW50ICogZC54LCB5ICsgY291bnQgKiBkLnkgKSA9PSBzdG9uZSAmJiBjb3VudCA+IDEgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBldmVudC5kYXRhIHw9ICggY291bnQgLSAxICkgPDwgKCA3ICogMyAtIGkgKiAzICk7CiAgICAgICAgICAgICAgICBpZiggTSA9PSBNT0RFOjp2YWxpZCApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpZiggTSA9PSBNT0RFOjphY3Rpb24gKQogICAgICAgICAgICAgICAgICAgIGZvciggdTMyIGMgPSAxOyBjIDwgY291bnQ7ICsrYyApCiAgICAgICAgICAgICAgICAgICAgICAgcHV0XyggeCArIGMgKiBkLngsIHkgKyBjICogZC55LCBzdG9uZSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiggTSA9PSBNT0RFOjphY3Rpb24gJiYgZXZlbnQuaXNfdmFsaWQoKSApCiAgICAgICAgewogICAgICAgICAgICBwdXRfKCB4LCB5LCBzdG9uZSApOwogICAgICAgICAgICAvLyBhZGQgdG8gaGlzdG9yeQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICBldmVudDsKICAgIH0KCiAgICBDU1RSICAgICAgICAgICAgICAgICAgICAgICAgQk9BUkQoKQogICAgewogICAgICAgIGZvciggdTMyIHggPSAwOyB4IDwgb3RoZWxsb19sZW5ndGggKyAyOyArK3ggKQogICAgICAgICAgICBib2FyZFsgMCBdWyB4IF0gPSBDRUxMOjp3YWxsOwogICAgICAgIGZvciggdTMyIHkgPSAxOyB5IDwgb3RoZWxsb19sZW5ndGggKyAxOyArK3kgKQogICAgICAgIHsKICAgICAgICAgICAgYm9hcmRbIHkgXVsgMCBdID0gQ0VMTDo6d2FsbDsKICAgICAgICAgICAgZm9yKCB1MzIgeCA9IDE7IHggPCBvdGhlbGxvX2xlbmd0aCArIDE7ICsreCApCiAgICAgICAgICAgICAgICBib2FyZFsgeSBdWyB4IF0gPSBDRUxMOjplbXB0eTsKICAgICAgICAgICAgYm9hcmRbIHkgXVsgb3RoZWxsb19sZW5ndGggKyAxIF0gPSBDRUxMOjp3YWxsOwogICAgICAgIH0KICAgICAgICBmb3IoIHUzMiB4ID0gMDsgeCA8IG90aGVsbG9fbGVuZ3RoICsgMjsgKyt4ICkKICAgICAgICAgICAgYm9hcmRbIG90aGVsbG9fbGVuZ3RoICsgMSBdWyB4IF0gPSBDRUxMOjp3YWxsOwoKICAgICAgICBwdXRfKCAzLCAzLCBDRUxMOjpibGFjayApOwogICAgICAgIHB1dF8oIDQsIDQsIENFTEw6OmJsYWNrICk7CiAgICAgICAgcHV0XyggMywgNCwgQ0VMTDo6d2hpdGUgKTsKICAgICAgICBwdXRfKCA0LCAzLCBDRUxMOjp3aGl0ZSApOwogICAgfQoKICAgIGZyaWVuZCAgc3RkOjpvc3RyZWFtJiAgICAgICBvcGVyYXRvcjw8KCBzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCT0FSRCYgYiApCiAgICB7CiAgICAgICAgY29uc3QgICBzdGQ6OnN0cmluZyB0aWxlW10gPSB7ICLCtyIsICLil4siLCAi4pePIiwgIuKWqCIgfTsKICAgICAgICBmb3IoIHUzMiB5ID0gMDsgeSA8IG90aGVsbG9fbGVuZ3RoICsgMjsgKyt5ICkKICAgICAgICB7CiAgICAgICAgICAgIGZvciggdTMyIHggPSAwOyB4IDwgb3RoZWxsb19sZW5ndGggKyAyOyArK3ggKQogICAgICAgICAgICAgICAgb3MgPDwgdGlsZVsgKGludCliLmJvYXJkWyB5IF1bIHggXSBdOwogICAgICAgICAgICBvcyA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiAgb3M7CiAgICB9Cn07Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojaW5jbHVkZSA8c3N0cmVhbT4KCmludCBtYWluKCkKewogICAgc3RkOjppc3RyaW5nc3RyZWFtIGNpbl8oICI1MyA1MiA0MiAzMiAyMiA1NCA1NSAyMyA2MiAiICk7CgogICAgQk9BUkQgICBib2FyZDsKICAgIENFTEwgICAgdHVybiA9IENFTEw6OmJsYWNrOwoKICAgIHdoaWxlKCAxICkKICAgIHsKICAgICAgICBjb3V0IDw8IGJvYXJkIDw8IGVuZGw7CiAgICAgICAgaW50IHgsIHksIGk7ICAgICAgICAKICAgICAgICBjaW5fID4+IGk7CiAgICAgICAgeCA9IGkgLyAxMDsKICAgICAgICB5ID0gaSAlIDEwOwogICAgICAgIGlmKCBjaW5fLmVvZigpICkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgRVZFTlQgICBldmVudCA9IGJvYXJkLnB1dDwgTU9ERTo6YWN0aW9uID4oIHgsIHksIHR1cm4gKTsKICAgICAgICBjb3V0IDw8IGV2ZW50LnRvX3N0cmluZygpIDw8ICIgIiA8PCBldmVudC5zY29yZSgpIDw8IGVuZGw7CiAgICAgICAgdHVybiA9IHN0YXRpY19jYXN0PCBDRUxMID4oICh1MzIpdHVybiBeICh1MzIpQ0VMTDo6d2FsbCApOwogICAgfQoKICAgIGdldGNoYXIoKTsKICAgIHJldHVybiAwOwp9Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCg==