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

Go 复制代码
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[i1] = make([]*point, n)
		for j := 0; j < n; j++ {
			itemPoint := &point{
				x:     i1,
				y:     j,
				value: 0,
			}
			img[i1][j] = 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[i1][j].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[i1][j].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[i1][j].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[itemX][itemY].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[i1][j].value == 1 {
				list = append(list, &point{
					x:     i1,
					y:     j,
					value: i.points[i1][j].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[i], _ = strconv.Atoi(s2)
	}

	var m, n int
	m = inputIntList[0]
	n = inputIntList[1]

	myImage := new(image)
	img := myImage.newImage(m, n)
	img.setPointValue(&point{
		x:     inputIntList[2],
		y:     inputIntList[3],
		value: 1,
	})
	img.setPointValue(&point{
		x:     inputIntList[4],
		y:     inputIntList[5],
		value: 1,
	})

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

}

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

相关推荐
深鱼~37 分钟前
大模型底层算力支撑:ops-math在矩阵乘法上的优化
人工智能·线性代数·矩阵·cann
Zfox_44 分钟前
CANN PyPTO 编程范式深度解析:并行张量与 Tile 分块操作的架构原理、内存控制与流水线调度机制
线性代数·矩阵·架构
TechWJ44 分钟前
catlass深度解析:Ascend平台的高性能矩阵运算模板库
线性代数·矩阵·ascend·cann·catlass
deep_drink17 小时前
【基础知识一】线性代数的核心:从矩阵变换到 SVD 终极奥义
线性代数·机器学习·矩阵
数智工坊18 小时前
【数据结构-特殊矩阵】3.5 特殊矩阵-压缩存储
数据结构·线性代数·矩阵
AI科技星18 小时前
张祥前统一场论核心场方程的经典验证-基于电子与质子的求导溯源及力的精确计算
线性代数·算法·机器学习·矩阵·概率论
deep_drink21 小时前
【基础知识二】彻底读懂拉普拉斯矩阵 (Laplacian)
人工智能·深度学习·线性代数·矩阵
Amber勇闯数分1 天前
【Hive】基于物品协同过滤 [ ItemCF ] 推荐课程-余弦相似度计算
大数据·数据仓库·hive·hadoop·矩阵
西电研梦1 天前
26西电考研 | 寒假开始,机试 or C语言程序设计怎么准备?
c语言·考研·华为od·研究生·西安电子科技大学·计算机408
无限码力2 天前
华为OD技术面真题 - Mysql相关 - 4
mysql·华为od·华为od技术面真题·华为od技术面八股·华为od技术面八股文·华为od技术面mysql相关