| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | 
							- package main
 
- import (
 
- 	"fmt"
 
- )
 
- func solve(board [][]byte) {
 
- 	height := len(board)
 
- 	if height == 0 {
 
- 		return
 
- 	}
 
- 	width := len(board[0])
 
- 	type Grid struct {
 
- 		X int
 
- 		Y int
 
- 	}
 
- 	flipMap := make(map[Grid]bool, 0)
 
- 	stack := make([]Grid, 0)
 
- 	for y := 0; y < height; y++ {
 
- 		for x := 0; x < width; x++ {
 
- 			if (x == 0 || x == width-1 || y == 0 || y == height-1) &&
 
- 				board[y][x] == 'O' {
 
- 				flipMap[Grid{x, y}] = true
 
- 				stack = append(stack, Grid{x, y})
 
- 			}
 
- 		}
 
- 	}
 
- 	for len(stack) != 0 {
 
- 		length := len(stack)
 
- 		grid := stack[length-1] // Pop top grid
 
- 		stack = stack[:length-1]
 
- 		if grid.X > 0 &&
 
- 			!flipMap[Grid{grid.X - 1, grid.Y}] && // If left grid's not visited
 
- 			board[grid.Y][grid.X-1] == 'O' {
 
- 			flipMap[Grid{grid.X - 1, grid.Y}] = true
 
- 			stack = append(stack, Grid{grid.X - 1, grid.Y})
 
- 		}
 
- 		if grid.X < width-1 &&
 
- 			!flipMap[Grid{grid.X + 1, grid.Y}] && // ...Right grid
 
- 			board[grid.Y][grid.X+1] == 'O' {
 
- 			flipMap[Grid{grid.X + 1, grid.Y}] = true
 
- 			stack = append(stack, Grid{grid.X + 1, grid.Y})
 
- 		}
 
- 		if grid.Y > 0 &&
 
- 			!flipMap[Grid{grid.X, grid.Y - 1}] && // ...Up
 
- 			board[grid.Y-1][grid.X] == 'O' {
 
- 			flipMap[Grid{grid.X, grid.Y - 1}] = true
 
- 			stack = append(stack, Grid{grid.X, grid.Y - 1})
 
- 		}
 
- 		if grid.Y < height-1 &&
 
- 			!flipMap[Grid{grid.X, grid.Y + 1}] && //...Down
 
- 			board[grid.Y+1][grid.X] == 'O' {
 
- 			flipMap[Grid{grid.X, grid.Y + 1}] = true
 
- 			stack = append(stack, Grid{grid.X, grid.Y + 1})
 
- 		}
 
- 	}
 
- 	for y := 0; y < height; y++ {
 
- 		for x := 0; x < width; x++ {
 
- 			if !flipMap[Grid{x, y}] && board[y][x] == 'O' {
 
- 				board[y][x] = 'X'
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- func printBoard(board [][]byte) {
 
- 	for _, row := range board {
 
- 		for _, val := range row {
 
- 			fmt.Printf("%c ", val)
 
- 		}
 
- 		println()
 
- 	}
 
- }
 
- // func main() {
 
- // 	b1 := [][]byte{
 
- // 		{'X', 'X', 'X', 'X'},
 
- // 		{'X', 'O', 'X', 'X'},
 
- // 		{'X', 'X', 'O', 'X'},
 
- // 		{'X', 'X', 'O', 'X'}}
 
- // 	solve(b1)
 
- // 	printBoard(b1)
 
- // }
 
 
  |