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

打印 上一主题 下一主题

主题 1956|帖子 1956|积分 5868

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x


  1. package main
  2. import (
  3.         "errors"
  4.         "fmt"
  5.         "strconv"
  6.         "strings"
  7. )
  8. type point struct {
  9.         x     int
  10.         y     int
  11.         value int
  12. }
  13. type image struct {
  14.         w        int
  15.         h        int
  16.         allPoint int
  17.         points   [][]*point
  18. }
  19. func (i *image) newImage(m, n int) *image {
  20.         img := make([][]*point, m)
  21.         for i1 := 0; i1 < m; i1++ {
  22.                 img[i1] = make([]*point, n)
  23.                 for j := 0; j < n; j++ {
  24.                         itemPoint := &point{
  25.                                 x:     i1,
  26.                                 y:     j,
  27.                                 value: 0,
  28.                         }
  29.                         img[i1][j] = itemPoint
  30.                 }
  31.         }
  32.         return &image{
  33.                 w:        m,
  34.                 h:        n,
  35.                 allPoint: m * n,
  36.                 points:   img,
  37.         }
  38. }
  39. func (i *image) getPointValue(x, y int) (int, error) {
  40.         for i1 := 0; i1 < i.w; i1++ {
  41.                 for j := 0; j < i.h; j++ {
  42.                         if i1 == x && j == y {
  43.                                 return i.points[i1][j].value, nil
  44.                         }
  45.                 }
  46.         }
  47.         return 0, errors.New("not found")
  48. }
  49. func (i *image) setPointValue(p1 *point) (*image, error) {
  50.         for i1 := 0; i1 < i.w; i1++ {
  51.                 for j := 0; j < i.h; j++ {
  52.                         if i1 == p1.x && j == p1.y {
  53.                                 i.points[i1][j].value = p1.value
  54.                                 return i, nil
  55.                         }
  56.                 }
  57.         }
  58.         return nil, errors.New("not found")
  59. }
  60. func (i *image) setPointsValue(list []*point, value int) {
  61.         for _, p := range list {
  62.                 p.value = value
  63.                 i.setPointValue(p)
  64.         }
  65. }
  66. func (i *image) countWaitePoints() (count int) {
  67.         for i1 := 0; i1 < i.w; i1++ {
  68.                 for j := 0; j < i.h; j++ {
  69.                         if i.points[i1][j].value == 1 {
  70.                                 count++
  71.                         }
  72.                 }
  73.         }
  74.         return
  75. }
  76. func (i *image) isAllWaite() bool {
  77.         if i.countWaitePoints() == i.allPoint {
  78.                 return true
  79.         }
  80.         return false
  81. }
  82. // 获取一个点周围的非白色像素点
  83. func (i *image) listAroundNotWaitePoints(p1 *point) []*point {
  84.         list := make([]*point, 0)
  85.         centerX, centreY := p1.x, p1.y
  86.         for x := -1; x <= 1; x++ {
  87.                 for y := -1; y <= 1; y++ {
  88.                         if x != 0 && y != 0 {
  89.                                 continue
  90.                         }
  91.                         itemX := centerX + x
  92.                         itemY := centreY + y
  93.                         //溢出
  94.                         if itemX*itemY < 0 {
  95.                                 continue
  96.                         }
  97.                         if value, err := i.getPointValue(itemX, itemY); err == nil {
  98.                                 if value != 1 {
  99.                                         list = append(list, &point{
  100.                                                 x:     itemX,
  101.                                                 y:     itemY,
  102.                                                 value: i.points[itemX][itemY].value,
  103.                                         })
  104.                                 }
  105.                         }
  106.                 }
  107.         }
  108.         return list
  109. }
  110. func (i *image) listWaitePoints() []*point {
  111.         list := make([]*point, 0)
  112.         for i1 := 0; i1 < i.w; i1++ {
  113.                 for j := 0; j < i.h; j++ {
  114.                         if i.points[i1][j].value == 1 {
  115.                                 list = append(list, &point{
  116.                                         x:     i1,
  117.                                         y:     j,
  118.                                         value: i.points[i1][j].value,
  119.                                 })
  120.                         }
  121.                 }
  122.         }
  123.         return list
  124. }
  125. func (i *image) timer(count int) int {
  126.         if i.isAllWaite() {
  127.                 return count
  128.         } else {
  129.                 count++
  130.                 waitePoints := i.listWaitePoints()
  131.                 for _, waitePoint := range waitePoints {
  132.                         //开始膨胀
  133.                         if notWaitePoints := i.listAroundNotWaitePoints(waitePoint); len(notWaitePoints) > 0 {
  134.                                 i.setPointsValue(notWaitePoints, 1)
  135.                         }
  136.                 }
  137.                 return i.timer(count)
  138.         }
  139. }
  140. func main() {
  141.         var inputStr string
  142.         fmt.Scan(&inputStr)
  143.         inputStrList := strings.Split(inputStr, ",")
  144.         inputIntList := make([]int, len(inputStrList))
  145.         for i, s2 := range inputStrList {
  146.                 inputIntList[i], _ = strconv.Atoi(s2)
  147.         }
  148.         var m, n int
  149.         m = inputIntList[0]
  150.         n = inputIntList[1]
  151.         myImage := new(image)
  152.         img := myImage.newImage(m, n)
  153.         img.setPointValue(&point{
  154.                 x:     inputIntList[2],
  155.                 y:     inputIntList[3],
  156.                 value: 1,
  157.         })
  158.         img.setPointValue(&point{
  159.                 x:     inputIntList[4],
  160.                 y:     inputIntList[5],
  161.                 value: 1,
  162.         })
  163.         count := img.timer(0)
  164.         fmt.Println(count)
  165. }
复制代码
总结:矩阵扩散在图形图像中被称为膨胀,结合openCV中对图片和像素点的界说,在程序中我界说了两种struct: image 和point,并实现了膨胀系数为1的膨胀算法。在通过递归的方式不断执行膨胀操纵,知道全部点都变白,则停止递归,每次膨胀时计数器timer加一,递归竣过后返回timer.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表