笑看天下无敌手 发表于 2024-10-14 14:38:28

华为OD机试真题】68、矩阵扩散

https://i-blog.csdnimg.cn/direct/535a043045b540f8b4fd84cc48aa895d.png
https://i-blog.csdnimg.cn/direct/9440a8b8e76b4eab977ee8f42408f306.png
package main

import (
        "errors"
        "fmt"
        "strconv"
        "strings"
)

type point struct {
        x   int
        y   int
        value int
}

type image struct {
        w      int
        h      int
        allPoint int
        points   [][]*point
}

func (i *image) newImage(m, n int) *image {
        img := make([][]*point, m)
        for i1 := 0; i1 < m; i1++ {
                img = make([]*point, n)
                for j := 0; j < n; j++ {
                        itemPoint := &point{
                                x:   i1,
                                y:   j,
                                value: 0,
                        }
                        img = itemPoint
                }
        }

        return &image{
                w:      m,
                h:      n,
                allPoint: m * n,
                points:   img,
        }
}

func (i *image) getPointValue(x, y int) (int, error) {
        for i1 := 0; i1 < i.w; i1++ {
                for j := 0; j < i.h; j++ {
                        if i1 == x && j == y {
                                return i.points.value, nil
                        }
                }
        }

        return 0, errors.New("not found")
}

func (i *image) setPointValue(p1 *point) (*image, error) {
        for i1 := 0; i1 < i.w; i1++ {
                for j := 0; j < i.h; j++ {
                        if i1 == p1.x && j == p1.y {
                                i.points.value = p1.value
                                return i, nil
                        }
                }
        }

        return nil, errors.New("not found")
}

func (i *image) setPointsValue(list []*point, value int) {
        for _, p := range list {
                p.value = value
                i.setPointValue(p)
        }
}

func (i *image) countWaitePoints() (count int) {
        for i1 := 0; i1 < i.w; i1++ {
                for j := 0; j < i.h; j++ {
                        if i.points.value == 1 {
                                count++
                        }
                }
        }
        return
}

func (i *image) isAllWaite() bool {
        if i.countWaitePoints() == i.allPoint {
                return true
        }
        return false
}

// 获取一个点周围的非白色像素点
func (i *image) listAroundNotWaitePoints(p1 *point) []*point {
        list := make([]*point, 0)
        centerX, centreY := p1.x, p1.y
        for x := -1; x <= 1; x++ {
                for y := -1; y <= 1; y++ {
                        if x != 0 && y != 0 {
                                continue
                        }

                        itemX := centerX + x
                        itemY := centreY + y
                        //溢出
                        if itemX*itemY < 0 {
                                continue
                        }
                        if value, err := i.getPointValue(itemX, itemY); err == nil {
                                if value != 1 {
                                        list = append(list, &point{
                                                x:   itemX,
                                                y:   itemY,
                                                value: i.points.value,
                                        })
                                }
                        }

                }
        }

        return list
}

func (i *image) listWaitePoints() []*point {
        list := make([]*point, 0)

        for i1 := 0; i1 < i.w; i1++ {
                for j := 0; j < i.h; j++ {
                        if i.points.value == 1 {
                                list = append(list, &point{
                                        x:   i1,
                                        y:   j,
                                        value: i.points.value,
                                })
                        }
                }
        }

        return list
}

func (i *image) timer(count int) int {
        if i.isAllWaite() {
                return count
        } else {
                count++

                waitePoints := i.listWaitePoints()
                for _, waitePoint := range waitePoints {
                        //开始膨胀
                        if notWaitePoints := i.listAroundNotWaitePoints(waitePoint); len(notWaitePoints) > 0 {
                                i.setPointsValue(notWaitePoints, 1)
                        }
                }
                return i.timer(count)
        }

}

func main() {
        var inputStr string
        fmt.Scan(&inputStr)
        inputStrList := strings.Split(inputStr, ",")
        inputIntList := make([]int, len(inputStrList))
        for i, s2 := range inputStrList {
                inputIntList, _ = strconv.Atoi(s2)
        }

        var m, n int
        m = inputIntList
        n = inputIntList

        myImage := new(image)
        img := myImage.newImage(m, n)
        img.setPointValue(&point{
                x:   inputIntList,
                y:   inputIntList,
                value: 1,
        })
        img.setPointValue(&point{
                x:   inputIntList,
                y:   inputIntList,
                value: 1,
        })

        count := img.timer(0)
        fmt.Println(count)

}
总结:矩阵扩散在图形图像中被称为膨胀,结合openCV中对图片和像素点的界说,在程序中我界说了两种struct: image 和point,并实现了膨胀系数为1的膨胀算法。在通过递归的方式不断执行膨胀操纵,知道全部点都变白,则停止递归,每次膨胀时计数器timer加一,递归竣过后返回timer.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 华为OD机试真题】68、矩阵扩散