배열로는 이미 만들어 봐서 비트연산 방식으로 만들어 보고 있었음


방법은 다음과 같음

:

2bit씩 18bit를 할당할 수 있으므로

배열 말고도 그냥 int 하나만 있어도 된다.


2비트 중 첫 번째 비트는 칸이 놓여졌는지의 여부 기록,

두 번째 비트는 O, X의 구분 기록


그러면, 

한 쪽의 승리 조건은 

&= 11 11 11 

     00 00 00

     00 00 00

&= 00 00 00

    11 11 11

    00 00 00

&= 00 00 00

    00 00 00

    11 11 11

&= 11 00 00

    11 00 00

    11 00 00

&= 00 11 00

    00 11 00

    00 11 00

&= 00 00 11

    00 00 11

    00 00 11

&= 11 00 00

     00 11 00

     00 00 11

&= 00 00 11

     00 11 00

     11 00 00

다른 한 쪽의 승리 조건은

&= 01 01 01 

     00 00 00

     00 00 00

&= 00 00 00

    01 01 01

    00 00 00

&= 00 00 00

    00 00 00

    01 01 01

&= 01 00 00

    01 00 00

    01 00 00

&= 00 01 00

    00 01 00

    00 01 00

&= 00 00 01

    00 00 01

    00 00 01

&= 01 00 00

     00 01 00

     00 00 01

&= 00 00 01

     00 01 00

     01 00 00

이므로 각각


X의 경우

0x3F000

0x03FC0

0x0003F


0x30C30

0x0C30C

0x030C3


0x30303

0x03330


O의 경우

0x15000

0x00540

0x00015


0x10410

0x04104

0x01041


0x10101

0x01110


로 매칭된다.


따라서

int x = 0; if ((0x3F000 & x) == 0x3F000 || (0x03FC0 & x) == 0x03FC0 || (0x0003F & x) == 0x0003F || (0x30C30 & x) == 0x30C30 || (0x0C30C & x) == 0x0C30C || (0x030C3 & x) == 0x030C3 || (0x30303 & x) == 0x30303 || (0x03330 & x) == 0x03330 ) { std::cout << "X win"; } else if ((0x15000 & x) == 0x15000 || (0x00540 & x) == 0x00540 || (0x00015 & x) == 0x00015 || (0x10410 & x) == 0x10410 || (0x04104 & x) == 0x04104 || (0x01041 & x) == 0x01041 || (0x10101 & x) == 0x10101 || (0x01110 & x) == 0x01110 ) { std::cout << "O win"; }


승리 조건 판별하는데 너무 긴것 같은데 최적화안될까요?


제가 봤을 땐 이 방법은 답이 없는 것 같은데

어찌하면 좋을까요?