Leetcode 733题 广度优先搜索

题目如下:
在这里插入图片描述
题目简介:接收一个大小为[n][m]的数组,其中数组有颜色oldcolor(数字表示),没颜色的用0表示,需要从(sr,sc)位置开始将颜色oldcolor变成newcolor,但是假如oldcolor周围均为0就不用渲染。
很明显是一个广度优先搜索进行遍历数组的题目,广度优先遍历的需要有两点
①队列来进行记录当前位置以及当前元素,以及下一个位置的位置以及元素;
②需要对当前位置四周进行判断是否是有颜色,以及该位置有没有走过。在这里插入图片描述
首先定义结构体point纪录当前位置以及颜色;定义一个队列,其中数组data用来装point型的信息。
在这里插入图片描述
队列需要的函数,这不仔细写看之前的文章。
在这里插入图片描述
创建一个队列q,以及二维数组oldimage来接收输入的数组,数组visited来表示走过和未走过的位置,newimage作为结果输出的数组,以及起点startpoint。通过scanf来接收题目信息,这里要注意需要setbuf(stdin,0)解决输入缓存问题。
在这里插入图片描述
需要做一些预处理,首先是将起点位置以及起点颜色定义为一个point型,创建一个point型的temp来进行队列元素的重复操作,将队列重置,将起点进队。在这里插入图片描述
开始搜索,判断语句是队列若为空则停止,不为空便继续搜索 。首先设置起点信息,然后判断当前位置的左边一个位置(x-1.y)颜色不是0,颜色是旧颜色,且左边位置没有走过,并且左边位置处于整个图中就可以将左边一个位置的信息(位置,改过后的颜色)进队,当然旧的颜色和新的颜色一定不一样而且y是一定在图中的所以可以改进。在这里插入图片描述
左边一个位置搜索结束之后,右边,下面,上面,都搜索一次,搜索完将当前位置出队。
在这里插入图片描述

最后结束就得到选然后的图newimage,遍历一下即可得到新的图。