// File: smallHW89[P]gobang/GoBang_ChessBoard.cpp
// Function: ChessBoard::IsSide4(char*, int, int, int&, int&)
bool ChessBoard::IsSide4(char oneLine[], int len , int pos, int &resL, int &resR)
{
    char side = oneLine[pos];
    if( Chess_Empty == side  )
        return  false;
    if( pos > len || pos<0 )
        return false;
    if( side != oneLine[pos])
        return false;

    int ri =pos, li=pos;
    int rr =pos, ll=pos;
    while( oneLine[li-1] == side )  li--;
    while( oneLine[ri+1] == side )  ri++;
    rr = ri; ll = li; 
    while( oneLine[ll-1] == Chess_Empty || oneLine[ll-1] == side ) ll--;
    while( oneLine[rr+1] == Chess_Empty || oneLine[rr+1] == side ) rr++;

    if(rr - ll +1 < 5)
        return false;
    
    int cnt = ri - li +1; 
    if(cnt ==4 &&  ll == li && rr > ri)
    {
        resL= li;
        resR= ri;   
        return true;
    }
    if(cnt == 4 &&  rr == ri && ll < li  )
    {
        resL = li;
        resR = ri;
        return true;
    }
    cnt = 0; 
    //向左尝试放4个
    int kk=0, ii=0, rL = 0, rR = 0;
    for( kk = ri ; kk>=ll && ii<5 ; kk--, ii++)
    {
        if (oneLine[kk] != Chess_Empty)
            continue;
        oneLine[kk] = side;

        bool res = Is5(oneLine,len ,pos, rL, rR );
        if(res )
            cnt++;
        oneLine[kk] = Chess_Empty;
    }
    //向右4个
    ii=0;
    for( kk = li ; kk<=rr  && ii<5 ; kk++ ,ii++)
    {
        if (oneLine[kk] != Chess_Empty)
            continue;
        oneLine[kk] = side;

        bool res = Is5(oneLine,len ,pos, rL, rR );
        if(res )
            cnt++;
        oneLine[kk] = Chess_Empty;
    }
    if(cnt == 1)
    {
        resL = li;
        resR = ri;
        return true;
    }
    return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl %edx, -0x1c(%rbp)
movl %ecx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x18(%rbp), %rax
movslq -0x20(%rbp), %rcx
movb (%rax,%rcx), %al
movb %al, -0x31(%rbp)
movsbl -0x31(%rbp), %ecx
movl $0x65, %eax
cmpl %ecx, %eax
jne 0x1baa
movb $0x0, -0x1(%rbp)
jmp 0x1ee9
movl -0x20(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jg 0x1bb8
cmpl $0x0, -0x20(%rbp)
jge 0x1bc1
movb $0x0, -0x1(%rbp)
jmp 0x1ee9
movsbl -0x31(%rbp), %eax
movq -0x18(%rbp), %rcx
movslq -0x20(%rbp), %rdx
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
je 0x1bde
movb $0x0, -0x1(%rbp)
jmp 0x1ee9
movl -0x20(%rbp), %eax
movl %eax, -0x38(%rbp)
movl -0x20(%rbp), %eax
movl %eax, -0x3c(%rbp)
movl -0x20(%rbp), %eax
movl %eax, -0x40(%rbp)
movl -0x20(%rbp), %eax
movl %eax, -0x44(%rbp)
movq -0x18(%rbp), %rax
movl -0x3c(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %eax
movsbl -0x31(%rbp), %ecx
cmpl %ecx, %eax
jne 0x1c1a
movl -0x3c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x1bf6
jmp 0x1c1c
movq -0x18(%rbp), %rax
movl -0x38(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %eax
movsbl -0x31(%rbp), %ecx
cmpl %ecx, %eax
jne 0x1c40
movl -0x38(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x38(%rbp)
jmp 0x1c1c
movl -0x38(%rbp), %eax
movl %eax, -0x40(%rbp)
movl -0x3c(%rbp), %eax
movl %eax, -0x44(%rbp)
movq -0x18(%rbp), %rax
movl -0x44(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %ecx
movb $0x1, %al
cmpl $0x65, %ecx
movb %al, -0x69(%rbp)
je 0x1c84
movq -0x18(%rbp), %rax
movl -0x44(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %eax
movsbl -0x31(%rbp), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0x69(%rbp)
movb -0x69(%rbp), %al
testb $0x1, %al
jne 0x1c8d
jmp 0x1c98
movl -0x44(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x1c4c
jmp 0x1c9a
movq -0x18(%rbp), %rax
movl -0x40(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %ecx
movb $0x1, %al
cmpl $0x65, %ecx
movb %al, -0x6a(%rbp)
je 0x1cd2
movq -0x18(%rbp), %rax
movl -0x40(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movsbl (%rax,%rcx), %eax
movsbl -0x31(%rbp), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0x6a(%rbp)
movb -0x6a(%rbp), %al
testb $0x1, %al
jne 0x1cdb
jmp 0x1ce6
movl -0x40(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x40(%rbp)
jmp 0x1c9a
movl -0x40(%rbp), %eax
subl -0x44(%rbp), %eax
addl $0x1, %eax
cmpl $0x5, %eax
jge 0x1cfd
movb $0x0, -0x1(%rbp)
jmp 0x1ee9
movl -0x38(%rbp), %eax
subl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x48(%rbp)
cmpl $0x4, -0x48(%rbp)
jne 0x1d3a
movl -0x44(%rbp), %eax
cmpl -0x3c(%rbp), %eax
jne 0x1d3a
movl -0x40(%rbp), %eax
cmpl -0x38(%rbp), %eax
jle 0x1d3a
movl -0x3c(%rbp), %ecx
movq -0x28(%rbp), %rax
movl %ecx, (%rax)
movl -0x38(%rbp), %ecx
movq -0x30(%rbp), %rax
movl %ecx, (%rax)
movb $0x1, -0x1(%rbp)
jmp 0x1ee9
cmpl $0x4, -0x48(%rbp)
jne 0x1d6b
movl -0x40(%rbp), %eax
cmpl -0x38(%rbp), %eax
jne 0x1d6b
movl -0x44(%rbp), %eax
cmpl -0x3c(%rbp), %eax
jge 0x1d6b
movl -0x3c(%rbp), %ecx
movq -0x28(%rbp), %rax
movl %ecx, (%rax)
movl -0x38(%rbp), %ecx
movq -0x30(%rbp), %rax
movl %ecx, (%rax)
movb $0x1, -0x1(%rbp)
jmp 0x1ee9
movl $0x0, -0x48(%rbp)
movl $0x0, -0x4c(%rbp)
movl $0x0, -0x50(%rbp)
movl $0x0, -0x54(%rbp)
movl $0x0, -0x58(%rbp)
movl -0x38(%rbp), %eax
movl %eax, -0x4c(%rbp)
movl -0x4c(%rbp), %ecx
xorl %eax, %eax
cmpl -0x44(%rbp), %ecx
movb %al, -0x6b(%rbp)
jl 0x1dab
cmpl $0x5, -0x50(%rbp)
setl %al
movb %al, -0x6b(%rbp)
movb -0x6b(%rbp), %al
testb $0x1, %al
jne 0x1db4
jmp 0x1e27
movq -0x18(%rbp), %rax
movslq -0x4c(%rbp), %rcx
movsbl (%rax,%rcx), %eax
cmpl $0x65, %eax
je 0x1dc7
jmp 0x1e10
movq -0x68(%rbp), %rdi
movb -0x31(%rbp), %dl
movq -0x18(%rbp), %rax
movslq -0x4c(%rbp), %rcx
movb %dl, (%rax,%rcx)
movq -0x18(%rbp), %rsi
movl -0x1c(%rbp), %edx
movl -0x20(%rbp), %ecx
leaq -0x54(%rbp), %r8
leaq -0x58(%rbp), %r9
callq 0x17e0
andb $0x1, %al
movb %al, -0x59(%rbp)
testb $0x1, -0x59(%rbp)
je 0x1e04
movl -0x48(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x48(%rbp)
movq -0x18(%rbp), %rax
movslq -0x4c(%rbp), %rcx
movb $0x65, (%rax,%rcx)
movl -0x4c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x4c(%rbp)
movl -0x50(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x50(%rbp)
jmp 0x1d94
movl $0x0, -0x50(%rbp)
movl -0x3c(%rbp), %eax
movl %eax, -0x4c(%rbp)
movl -0x4c(%rbp), %ecx
xorl %eax, %eax
cmpl -0x40(%rbp), %ecx
movb %al, -0x6c(%rbp)
jg 0x1e4b
cmpl $0x5, -0x50(%rbp)
setl %al
movb %al, -0x6c(%rbp)
movb -0x6c(%rbp), %al
testb $0x1, %al
jne 0x1e54
jmp 0x1ec7
movq -0x18(%rbp), %rax
movslq -0x4c(%rbp), %rcx
movsbl (%rax,%rcx), %eax
cmpl $0x65, %eax
je 0x1e67
jmp 0x1eb0
movq -0x68(%rbp), %rdi
movb -0x31(%rbp), %dl
movq -0x18(%rbp), %rax
movslq -0x4c(%rbp), %rcx
movb %dl, (%rax,%rcx)
movq -0x18(%rbp), %rsi
movl -0x1c(%rbp), %edx
movl -0x20(%rbp), %ecx
leaq -0x54(%rbp), %r8
leaq -0x58(%rbp), %r9
callq 0x17e0
andb $0x1, %al
movb %al, -0x5a(%rbp)
testb $0x1, -0x5a(%rbp)
je 0x1ea4
movl -0x48(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x48(%rbp)
movq -0x18(%rbp), %rax
movslq -0x4c(%rbp), %rcx
movb $0x65, (%rax,%rcx)
movl -0x4c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4c(%rbp)
movl -0x50(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x50(%rbp)
jmp 0x1e34
cmpl $0x1, -0x48(%rbp)
jne 0x1ee5
movl -0x3c(%rbp), %ecx
movq -0x28(%rbp), %rax
movl %ecx, (%rax)
movl -0x38(%rbp), %ecx
movq -0x30(%rbp), %rax
movl %ecx, (%rax)
movb $0x1, -0x1(%rbp)
jmp 0x1ee9
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x70, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)