美文网首页Aha! Algorithms
Aha! Algorithms - Floodfill

Aha! Algorithms - Floodfill

作者: su3 | 来源:发表于2017-03-18 16:57 被阅读0次

《啊哈!算法》第 4 章第 5 节,漫水填充法的 Swift 实现。

问题

给一个群岛地图中不同的岛屿填充不同的颜色,并统计地图中有多少个小岛。

解决

遍历每个点,并对与该点临近的点采用深度优先搜索算法进行填充。

// 0 = 海洋;1~9 = 陆地
var a =    [[1, 2, 1, 0, 0, 0, 0, 0, 2, 3],
            [3, 0, 2, 0, 1, 2, 1, 0, 1, 2],
            [4, 0, 1, 0, 1, 2, 3, 2, 0, 1],
            [3, 2, 0, 0, 0, 1, 2, 4, 0, 0],
            [0, 0, 0, 0, 0, 0, 1, 5, 3, 0],
            [0, 1, 2, 1, 0, 1, 5, 4, 3, 0],
            [0, 1, 2, 3, 1, 3, 6, 2, 1, 0],
            [0, 0, 3, 4, 8, 9, 7, 5, 0, 0],
            [0, 0, 0, 3, 7, 8, 6, 0, 1, 2],
            [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]]

let n = a.count //行,纵向为 X 轴
let m = a[0].count //列,横向为 Y 轴

//坐标的改变表示探索方向
let next = [[0, 1],  //x 不变,y + 1,向右走
    [1, 0],  //y 不变,x + 1,向下走
    [0, -1], //向左走
    [-1, 0]] //向上走

//假设地图面积不超过 50 X 50,初始化一个二维数组用于保存走过的地方
var tmp = [Int](repeatElement(0, count: 50))
var book = [[Int]](repeatElement(tmp, count: 50))

func dfs(x: Int, y: Int, color: Int){
    a[x][y] = color

    for k in 0...3 {
        let tx = x + next[k][0]
        let ty = y + next[k][1]
        
        if tx < 0 || tx >= n || ty < 0 || ty >= m{
            continue
        }
        
        //判断是否陆地并且还未标记过
        if a[tx][ty] > 0 && book[tx][ty] == 0{
            book[tx][ty] = 1 //标记已走过这个点
            dfs(x: tx, y: ty, color: color) //尝试下一个点
        }
    }   
}

var sum = 0
var color = 0

for i in 0..<n {
    for j in 0..<m {
        if a[i][j] > 0 {
            sum += 1
            color -= 1 //每个岛用不同的颜色编号
            book[i][j] = 1
            dfs(x: i, y: j, color: color)
        }
    }
}

//输出着色后的地图
for i in 0..<n {
    for j in 0..<m {
        let c = a[i][j]
        let s = (c == 0) ? " \(a[i][j])" : "\(a[i][j])"
        print(s, separator: "", terminator: " ")
    }
    print("\n")
}

//输出小岛个数
print("有 \(sum) 个小岛")

输出

-1  0 -1  0 -3 -3 -3  0 -2 -2 

-1  0 -1  0 -3 -3 -3 -3  0 -2 

-1 -1  0  0  0 -3 -3 -3  0  0 

 0  0  0  0  0  0 -3 -3 -3  0 

 0 -3 -3 -3  0 -3 -3 -3 -3  0 

 0 -3 -3 -3 -3 -3 -3 -3 -3  0 

 0  0 -3 -3 -3 -3 -3 -3  0  0 

 0  0  0 -3 -3 -3 -3  0 -4 -4 

 0  0  0  0  0  0  0  0 -4  0 

有 4 个小岛

代码在 GitHub

相关文章

  • Aha! Algorithms - Floodfill

    《啊哈!算法》第 4 章第 5 节,漫水填充法的 Swift 实现。 问题 给一个群岛地图中不同的岛屿填充不同的颜...

  • Aha! Algorithms

    1. 涉及的数据结构 栈、队列、链表、树、并查集、堆、图 2. 涉及的算法 排序、枚举、深度和广度优先搜索、图的遍...

  • Aha! Algorithms - Quicksort

    《啊哈!算法》第 1 章第 3 节,快速排序的 Swift 实现 问题 为给定数字序列排序 解决 以左侧第一个位置...

  • Aha! Algorithms - Queue

    《啊哈!算法》第 2 章第 1 节,队列的 Swift 实现 问题 给一个数字序列,解密方法是:删除第 1 个,将...

  • Aha! Algorithms - Dijkstra

    《啊哈!算法》第 6 章第 2 节,Dijkstra 算法求最短路径的 Swift 实现。 问题 已经若干顶点和路...

  • Aha! Algorithms - Bomberman

    《啊哈!算法》第 3 章第 2 节,bomb 人的 Swift 实现。 问题 在哪里放置 bomb 才可以消灭最多...

  • Aha! Algorithms - Stack

    《啊哈!算法》第 2 章第 2 节,栈的 Swift 实现。 问题 判断字符串是否回文 解决 将字符串前半部分入栈...

  • Aha! Algorithms - Heap

    《啊哈!算法》第 7 章第 3 节,创建最小堆的 Swift 实现。 问题 把一个数组转换为最小堆,并从小到大输出...

  • Aha! Algorithms - Bucket Sort

    《啊哈!算法》第 1 章第 1 节,桶排序的 Swift 实现 问题 班上 5 个同学的考试成绩分别为:5 分,3...

  • Aha! Algorithms - Bubble Sort

    《啊哈!算法》第 1 章第 2 节,冒泡排序的 Swift 实现 问题 给学生成绩排序,打印排序后的名字(和成绩)...

网友评论

    本文标题:Aha! Algorithms - Floodfill

    本文链接:https://www.haomeiwen.com/subject/kbzunttx.html