Skip to content

Commit 4029a35

Browse files
Merge pull request #2921 from ideallain/master
增加岛屿数量深搜go版本
2 parents ca79c5e + 7df04d9 commit 4029a35

File tree

3 files changed

+243
-0
lines changed

3 files changed

+243
-0
lines changed

problems/kamacoder/0099.岛屿的数量深搜.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,75 @@ if __name__ == '__main__':
328328

329329
### Go
330330

331+
我们使用一个visited数组,记录下那些位置被遍历过。分为两层遍历。初始化一个visited数组和原始的grid一样大,用来记录哪些陆地被遍历过
332+
333+
第一层遍历遍历整个grid数组的元素,遇到陆地,就在对应的visited数组里标记,并且执行深度搜索,深搜的逻辑是把当前位置的4个方向上的位置,全部判断一遍看是不是陆地,如果是,则在这个位置上再执行深搜,达到递归深搜的效果。所以深搜函数里是递归的。
334+
335+
```go
336+
package main
337+
338+
import (
339+
"fmt"
340+
)
341+
342+
func visitIsland(grid [][]int) int {
343+
row := len(grid)
344+
if row == 0 {
345+
return 0
346+
}
347+
visited := make([][]bool, row)
348+
//go的这种初始化方式真的丑陋
349+
for i := 0; i < row; i++ {
350+
visited[i] = make([]bool, len(grid[0]))
351+
}
352+
ans := 0
353+
for i := 0; i < row; i++ {
354+
for j := 0; j < len(grid[0]); j++ {
355+
if grid[i][j] == 1 && !visited[i][j] {
356+
visited[i][j] = true
357+
ans++
358+
visitGrid(grid, visited, i, j)
359+
}
360+
}
361+
}
362+
return ans
363+
}
364+
365+
func visitGrid(grid [][]int, visited [][]bool, x int, y int) {
366+
diff := [4][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
367+
for _, arr := range diff {
368+
nextX := x + arr[0]
369+
nextY := y + arr[1]
370+
if nextX < 0 || nextX >= len(grid) || nextY < 0 || nextY >= len(grid[0]) {
371+
continue
372+
}
373+
if !visited[nextX][nextY] && grid[nextX][nextY] == 1 {
374+
visited[nextX][nextY] = true
375+
visitGrid(grid, visited, nextX, nextY)
376+
}
377+
}
378+
}
379+
380+
func main() {
381+
var row, col int
382+
fmt.Scan(&row, &col)
383+
if row <=0 || col <=0 {
384+
return
385+
}
386+
grid := make([][]int, row)
387+
for i := 0; i < row; i++ {
388+
grid[i] = make([]int, col)
389+
}
390+
for i := 0; i < row; i++ {
391+
for j := 0; j < col; j++ {
392+
fmt.Scan(&grid[i][j])
393+
}
394+
}
395+
//这里必须要打印,不然报错会显示潜在的数组越界
396+
fmt.Println(visitIsland(grid))
397+
}
398+
```
399+
331400
### Rust
332401

333402
### JavaScript

problems/kamacoder/0104.建造最大岛屿.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,104 @@ if __name__ == "__main__":
530530

531531
### Go
532532

533+
```go
534+
package main
535+
536+
import "fmt"
537+
538+
func main() {
539+
var m, n int
540+
fmt.Scan(&m, &n)
541+
542+
grid := make([][]int, m)
543+
for i := range grid {
544+
grid[i] = make([]int, n)
545+
for j := range grid[i] {
546+
fmt.Scan(&grid[i][j])
547+
}
548+
}
549+
550+
sum := buildMaxIsland(grid)
551+
fmt.Println(sum)
552+
}
553+
554+
555+
func buildMaxIsland(grid [][]int) int {
556+
result := 0
557+
if grid == nil || len(grid) == 0 {
558+
return result
559+
}
560+
hashMap := make(map[int]int)
561+
islandArea := 0
562+
gridMark := 2
563+
for i := 0; i < len(grid); i++ {
564+
for j := 0; j < len(grid[0]); j++ {
565+
if grid[i][j] == 1 {
566+
islandArea = 0
567+
visitGrid4(grid, i, j, &islandArea, gridMark)
568+
hashMap[gridMark] = islandArea
569+
if islandArea > result {
570+
result = islandArea
571+
}
572+
gridMark++
573+
}
574+
}
575+
}
576+
577+
for i := 0; i < len(grid); i++ {
578+
for j := 0; j < len(grid[0]); j++ {
579+
if grid[i][j] == 0 {
580+
sum := findNearByIsland(grid, i, j, hashMap)
581+
if sum > result {
582+
result = sum
583+
}
584+
}
585+
}
586+
}
587+
588+
return result
589+
}
590+
591+
func visitGrid4(grid [][]int, x int, y int, preValue *int, gridMark int) {
592+
if x < 0 || y < 0 || x >= len(grid) || y >= len(grid[0]) {
593+
return
594+
}
595+
//可以省略掉visited的原因是因为grid的每个位置如果被遍历过就会被标记为gridMark,能识别出来是不是被遍历过
596+
if grid[x][y] != 1 {
597+
return
598+
}
599+
// visited[x][y] = true
600+
grid[x][y] = gridMark
601+
*preValue++
602+
visitGrid4(grid, x+1, y, preValue, gridMark)
603+
visitGrid4(grid, x-1, y, preValue, gridMark)
604+
visitGrid4(grid, x, y+1, preValue, gridMark)
605+
visitGrid4(grid, x, y-1, preValue, gridMark)
606+
}
607+
608+
func findNearByIsland(grid [][]int, x, y int, hashMap map[int]int) int {
609+
markSet := make(map[int]bool)
610+
sum := 1
611+
coordinate := [][]int{{x + 1, y}, {x - 1, y}, {x, y + 1}, {x, y - 1}}
612+
for _, arr := range coordinate {
613+
if arr[0] < 0 || arr[1] < 0 || arr[0] >= len(grid) || arr[1] >= len(grid[0]) {
614+
continue
615+
}
616+
if grid[arr[0]][arr[1]] == 0 {
617+
continue
618+
}
619+
gridMark := grid[arr[0]][arr[1]]
620+
if !markSet[gridMark] {
621+
markSet[gridMark] = true
622+
sum += hashMap[gridMark]
623+
}
624+
}
625+
return sum
626+
}
627+
```
628+
629+
630+
533631
### Rust
534632

535633
### JavaScript

problems/kamacoder/0110.字符串接龙.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,82 @@ if __name__=='__main__':
270270

271271
### Go
272272

273+
```go
274+
package main
275+
276+
import (
277+
"bufio"
278+
"fmt"
279+
"os"
280+
"strconv"
281+
"strings"
282+
)
283+
284+
func connectWord(words []string, startWord string, endWord string) int {
285+
if words == nil || len(words) == 0 {
286+
return 0
287+
}
288+
var allWord = make(map[string]bool)
289+
for _, word := range words {
290+
allWord[word] = true
291+
}
292+
visitedWord := make(map[string]bool)
293+
queue := make([]string, 0)
294+
result := 1
295+
queue = append(queue, startWord)
296+
queue = append(queue, "")
297+
for len(queue) > 0 {
298+
word := queue[0]
299+
queue = queue[1:]
300+
if word == "" {
301+
if len(queue) > 0 {
302+
result++
303+
queue = append(queue, "")
304+
}
305+
continue
306+
}
307+
arr := []rune(word)
308+
for i := 0; i < len(arr); i++ {
309+
old := arr[i]
310+
for j := 'a'; j <= 'z'; j++ {
311+
arr[i] = j
312+
newWord := string(arr)
313+
if allWord[newWord] && !visitedWord[newWord] {
314+
visitedWord[newWord] = true
315+
queue = append(queue, newWord)
316+
if newWord == endWord {
317+
return result + 1
318+
}
319+
}
320+
}
321+
arr[i] = old
322+
}
323+
}
324+
return 0
325+
}
326+
327+
func main() {
328+
scanner := bufio.NewScanner(os.Stdin)
329+
scanner.Scan()
330+
n, _ := strconv.Atoi(scanner.Text())
331+
scanner.Scan()
332+
input := strings.Split(scanner.Text(), " ")
333+
beginStr := input[0]
334+
endStr := input[1]
335+
336+
wordList := []string{beginStr, endStr}
337+
for i := 0; i < n; i++ {
338+
scanner.Scan()
339+
wordList = append(wordList, scanner.Text())
340+
}
341+
count := connectWord(wordList, beginStr, endStr)
342+
fmt.Println(count)
343+
}
344+
345+
```
346+
347+
348+
273349
### Rust
274350

275351
### JavaScript

0 commit comments

Comments
 (0)