//題目:一個二維數組代表一個棋盤,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
}