你玩过“拉灯”游戏吗?
25 盏灯排成一个 5×5 的方形。
每一个灯都有一个开关,游戏者可以改变它的状态。
每一步,游戏者可以改变某一个灯的状态。
游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。
下面这种状态
10111
01101
10111
10000
11011
在改变了最左上角的灯的状态后将变成:
01111
11101
10111
10000
11011
再改变它正中间的灯后状态将变成:
01111
11001
11001
10100
11011
给定一些游戏的初始状态,编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮。
输入格式
第一行输入正整数 n,代表数据中共有 n 个待解决的游戏初始状态。
以下若干行数据分为 n 组,每组数据有 5 行,每行 5 个字符。
每组数据描述了一个游戏的初始状态。
各组数据间用一个空行分隔。
输出格式
一共输出 n 行数据,每行有一个小于等于 6 的整数,它表示对于输入数据中对应的游戏状态最少需要几步才能使所有灯变亮。
对于某一个游戏初始状态,若 6 步以内无法使所有灯变亮,则输出 −1。
数据范围 输入样例: 输出样例: 这里用二进制数表示矩阵的状态,恰好这个矩阵只有25个节点且每个节点只有0或1两种状态。 这种类型的题目可以利用广度优先搜索,从成功的状态,来逆推所有能成功到达的状态; 恰巧这个只能推六次,所以我就弄了个界定层次的一个end(整型),来判断当前处于第几层; 因为广度优先搜索具有寻找最短路径的那个特点,可以说,这个节点只要载入就一定会是最小的次数。 为了方便大家理解,具体的思路写在注释里面啦,大家可以看着动手写一写理解理解。 注意 : 广度优先搜索算法(又称 宽度优先搜索 )是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。 广度优先算法的核心思想是:从初始节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,若没有,再用产生式规则将所有第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点。若没有,再用算符逐一扩展第二层的所有节点……,如此依次扩展,检查下去,直到发现目标节点为止。即 从图中的某一顶点V0开始,先访问V0; 访问所有与V0相邻接的顶点V1,V2,…,Vt; 依次访问与V1,V2,…,Vt相邻接的所有未曾访问过的顶点; 循此以往,直至所有的顶点都被访问过为止。 这种搜索的次序体现沿层次向横向扩展的趋势,所以称之为广度优先搜索。
03
00111
01011
10001
11010
11100
11101
11101
11110
11111
11111
01111
11111
11111
11111
11111
3
2
-1
🍀题解 — 广度优先搜索+状态压缩+DP
📝代码展示
#include
【🎯知识点:广度优先搜索算法】
Dijkstra单源最短路径算法
和Prim最小生成树算法
都采用了和宽度优先搜索类似的思想。
持续更新,喜欢的话欢迎点赞👍、收藏⭐️+关注✌️哟~