void propagate_liberty(float *board, int *lib, int *visited, int row, int col, int side) { if (row < 0 || row > 18 || col < 0 || col > 18) return; int index = row*19 + col; if (board[index] != side) return; if (visited[index]) return; visited[index] = 1; lib[index] += 1; propagate_liberty(board, lib, visited, row+1, col, side); propagate_liberty(board, lib, visited, row-1, col, side); propagate_liberty(board, lib, visited, row, col+1, side); propagate_liberty(board, lib, visited, row, col-1, side); }
int *calculate_liberties(float *board) { int *lib = calloc(19*19, sizeof(int)); int visited[361]; int i, j; for(j = 0; j < 19; ++j){ for(i = 0; i < 19; ++i){ memset(visited, 0, 19*19*sizeof(int)); int index = j*19 + i; if(board[index] == 0){ if ((i > 0) && board[index - 1]) propagate_liberty(board, lib, visited, j, i-1, board[index-1]); if ((i < 18) && board[index + 1]) propagate_liberty(board, lib, visited, j, i+1, board[index+1]); if ((j > 0) && board[index - 19]) propagate_liberty(board, lib, visited, j-1, i, board[index-19]); if ((j < 18) && board[index + 19]) propagate_liberty(board, lib, visited, j+1, i, board[index+19]); } } } return lib; }
int *calculate_liberties(float *board) { int *lib = calloc(19*19, sizeof(int)); int visited[361]; int i, j; for(j = 0; j < 19; ++j){ for(i = 0; i < 19; ++i){ memset(visited, 0, 19*19*sizeof(int)); int index = j*19 + i; if(board[index]){ int side = board[index]; int num = 0; if (i > 0 && board[j*19 + i - 1] == 0) ++num; if (i < 18 && board[j*19 + i + 1] == 0) ++num; if (j > 0 && board[j*19 + i - 19] == 0) ++num; if (j < 18 && board[j*19 + i + 19] == 0) ++num; propagate_liberty(board, lib, visited, j, i, num, side); } } } return lib; }