华为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.

相关推荐
victory04312 天前
pytorch 矩阵乘法和实际存储形状的差异
人工智能·pytorch·矩阵
无限码力2 天前
华为OD技术面真题 - 计算机网络 - 3
计算机网络·华为od·面试·华为od技术面真题·华为od面试八股文·华为od技术面计算机网络相关
todoitbo2 天前
从零搭建鲲鹏 HPC 环境:从朴素矩阵乘法到高性能实现
线性代数·矩阵·鲲鹏·昇腾
lingzhilab2 天前
零知IDE——基于STMF103RBT6结合PAJ7620U2手势控制192位WS2812 RGB立方体矩阵
c++·stm32·矩阵
你要飞2 天前
Part 2 矩阵
笔记·线性代数·考研·矩阵
一条大祥脚2 天前
26.1.2 两个数的数位dp 分段快速幂 dp预处理矩阵系数
线性代数·矩阵
无限码力3 天前
华为OD技术面真题 - 计算机网络 - 2
计算机网络·华为od·华为od技术面真题·华为od面试八股文·华为od技术面计算机网络相关
无限码力3 天前
华为OD机试真题双机位C卷 【运维日志排序】C语言实现
c语言·华为od·华为od机考·华为od机试真题·华为od机试双机位c卷·华为od机考双机位c卷·华为od上机考试
Dream it possible!3 天前
LeetCode 面试经典 150_二分查找_搜索二维矩阵(112_74_C++_中等)
leetcode·面试·矩阵
AI科技星3 天前
电磁耦合常数Z‘的第一性原理推导与严格验证:张祥前统一场论的几何基石
服务器·人工智能·线性代数·算法·矩阵