1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| package main
import ( "fmt" "strconv" )
type point struct { val string x, y int isTrue bool }
var m, n int
func solve(board [][]byte) [][]byte { m, n = len(board), len(board[0]) var points map[string]*point points = make(map[string]*point, m*n)
for y := 1; y <= m; y++ { for x := 1; x <= n; x++ { points[getPointKey(x, y)] = &point{ val: string(board[y-1][x-1]), x: x, y: y, isTrue: false, } } }
for _, v := range points { if v.val == "O" && (v.x == 1 || v.y == 1 || v.x == n || v.y == m) { v.isTrue = true } }
for _, v := range points { if v.isTrue { checkAdjoin(v, points) } }
for _, v := range points { if v.isTrue == false { v.val = "X" } }
for i := 0; i < m; i++ { for j := 0; j < n; j++ { board[i][j] = []byte(points[getPointKey(j+1, i+1)].val)[0] } }
return board }
func checkAdjoin(p *point, points map[string]*point) { checkIsTrue(points, p.x-1, p.y) checkIsTrue(points, p.x+1, p.y) checkIsTrue(points, p.x, p.y-1) checkIsTrue(points, p.x, p.y+1) }
func checkIsTrue(points map[string]*point, x int, y int) { if x < 1 || x > n || y < 1 || y > m { return }
if p := points[getPointKey(x, y)]; p.isTrue == false && p.val == "O" { p.isTrue = true checkAdjoin(p, points) } }
func getPointKey(x int, y int) string { return strconv.Itoa(x) + "_" + strconv.Itoa(y) }
func main() { fmt.Println(solve([][]byte{ {88, 88, 88, 88, 88}, {88, 79, 79, 88, 88}, {88, 88, 79, 88, 88}, {88, 79, 88, 88, 88}, })) }
|