path.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package main
  2. import "fmt"
  3. var n, m int
  4. var dy = [4]int{0, 1, 0, -1}
  5. var dx = [4]int{1, 0, -1, 0}
  6. func getArea(grid [][]int) int {
  7. queue := make([][2]int, 0)
  8. used := make([][]bool, n)
  9. for i := range used {
  10. used[i] = make([]bool, m)
  11. }
  12. y, x := 0, 0
  13. for i := 0; i < 4; i++ {
  14. l := m - 1
  15. if i&1 == 1 {
  16. l = n - 1
  17. }
  18. for j := 0; j < l; j++ {
  19. if grid[y][x] == 0 {
  20. queue = append(queue, [2]int{y, x})
  21. used[y][x] = true
  22. }
  23. y, x = y+dy[i], x+dx[i]
  24. }
  25. }
  26. area, size := len(queue), len(queue)
  27. for size != 0 {
  28. pos := queue[0]
  29. queue = queue[1:]
  30. size--
  31. for i := 0; i < 4; i++ {
  32. ny, nx := pos[0]+dy[i], pos[1]+dx[i]
  33. if ny < 0 || n <= ny || nx < 0 || m <= nx || grid[ny][nx] == 1 || used[ny][nx] {
  34. continue
  35. }
  36. queue = append(queue, [2]int{ny, nx})
  37. used[ny][nx] = true
  38. }
  39. if size == 0 {
  40. size = len(queue)
  41. area += size
  42. }
  43. }
  44. return n*m - area
  45. }
  46. func main() {
  47. fmt.Scan(&n, &m)
  48. grid := make([][]int, n)
  49. for i := range grid {
  50. grid[i] = make([]int, m)
  51. }
  52. for i := 0; i < n; i++ {
  53. for j := 0; j < m; j++ {
  54. fmt.Scan(&grid[i][j])
  55. }
  56. }
  57. fmt.Println(getArea(grid))
  58. }