二維數組棋盤中,0是白色,1是黑色,求能相連起來的黑色塊的最大面積

//題目:一個二維數組代表一個棋盤,0表示白色,1表示黑色,算出相鄰的黑色的最大面積
type Node struct {
   I int
   J int
}

var area = make([]int, 0)
var BlackM = make(map[string]int, 0)
var Black = make([]Node, 0)

// 只循環黑色節點,就是說把所有黑色節點的下標存入一個數組和一個map
// 循環數組看每個黑色下標能連上的最大黑色節點,map用於判斷相鄰元素是否爲黑色
func main() {
   //0, 1
   //0, 2
   //1, 1
   //1, 2
   //1, 1
   //3, 3
   var arr = [][]int{{0, 1, 1, 0}, {0, 1, 1, 0}, {0, 1, 0, 0}, {0, 0, 0, 1}}
   InitBlack(arr)
   fmt.Print(FindMax())
}
func InitBlack(arr [][]int) {
   for i := 0; i < len(arr); i++ {
      for j := 0; j < len(arr[i]); j++ {
         if arr[i][j] == 1 {
            Black = append(Black, Node{I: i, J: j})
            key := strconv.Itoa(i) + "," + strconv.Itoa(j)
            BlackM[key] = 0
         }
      }
   }
}

func FindMax() int {
   for i := 0; i < len(Black); i++ {
      cur := Black[i]
      blackMCopy := make(map[string]int, 0)
      for k, v := range BlackM {
         blackMCopy[k] = v
      }
      area = append(area, AddCurCount(cur, blackMCopy)+1)
   }
   sort.Ints(area)
   return area[len(area)-1]
}

//分路遞歸
func AddCurCount(cur Node, blackM map[string]int) int {
   count := 0
   current := strconv.Itoa(cur.I) + "," + strconv.Itoa(cur.J)
   delete(blackM, current)
   down := strconv.Itoa(cur.I+1) + "," + strconv.Itoa(cur.J)
   up := strconv.Itoa(cur.I-1) + "," + strconv.Itoa(cur.J)
   right := strconv.Itoa(cur.I) + "," + strconv.Itoa(cur.J+1)
   left := strconv.Itoa(cur.I) + "," + strconv.Itoa(cur.J-1)
   if _, ok := blackM[down]; ok {
      delete(blackM, down)
      count++
      next := Node{I: cur.I + 1, J: cur.J}
      count += AddCurCount(next, blackM)
   }
   if _, ok := blackM[up]; ok {
      delete(blackM, up)
      count++
      next := Node{I: cur.I - 1, J: cur.J}
      count += AddCurCount(next, blackM)
   }
   if _, ok := blackM[right]; ok {
      delete(blackM, right)
      count++
      next := Node{I: cur.I, J: cur.J + 1}
      count += AddCurCount(next, blackM)
   }
   if _, ok := blackM[left]; ok {
      delete(blackM, left)
      count++
      next := Node{I: cur.I, J: cur.J - 1}
      count += AddCurCount(next, blackM)
   }
   return count
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章