ChapterII
本帖最后由 ChapterII 于 2020-5-15 21:43 编辑
如果论坛中已经有大佬有了类似的思路或成品,请见谅.此贴需要一定命令基础
(并不指望多少人能听懂)
不会排版,不喜勿喷
大佬懒得看,萌新看不懂系列
未更新完成,*表示未更新(咕咕咕)



2021.12 数据,可能有更多内容如果论坛中已经有大佬有了类似的思路或成品,请见谅.此贴需要一定命令基础
(并不指望多少人能听懂)
不会排版,不喜勿喷
大佬懒得看,萌新看不懂系列



啊啊啊写了一天的帖子论坛弄没了虽然我又写了一遍
未更新完成,*表示未更新(咕咕咕)



DFS,传说中的深度优先搜索
度凉百科
先不用管回溯递归之类的
原理分析:
图床炸了请通知作者
比如上图红色羊毛位置是起点,蓝色羊毛位置是终点,
deep_first_search:search函数的内容:
#Search, search, search...
execute at @e[tag=dfsAS] if block ~ ~-1 ~ blue_wool run tellraw @a {"text":"Reached","color":"#123456"}
execute as @e[tag=dfsAS] at @s unless block ~ ~-1 ~ blue_wool run setblock ~ ~ ~ stone keep
execute as @e[tag=dfsAS] at @s unless block ~ ~-1 ~ blue_wool if block ~1 ~ ~ air run function deep_first_search:move_x1
execute as @e[tag=dfsAS] at @s unless block ~ ~-1 ~ blue_wool if block ~-1 ~ ~ air run function deep_first_search:move_x_1
execute as @e[tag=dfsAS] at @s unless block ~ ~-1 ~ blue_wool if block ~ ~ ~1 air run function deep_first_search:move_y1
execute as @e[tag=dfsAS] at @s unless block ~ ~-1 ~ blue_wool if block ~ ~ ~-1 air run function deep_first_search:move_y_1



看不懂在说什么?只要你能看懂这几句命令的意思是
@e[tag=dfsAS的身份,在该实体位置,如果~1 ~ ~/~-1 ~ ~/~ ~ ~1/~ ~ ~-1是空气(即无方块)且除非脚下是蓝色羊毛,则执行function deep_first_search:move_x1或别的

就可以
它会按顺序检测上、下、左、右分别有无方块,
如果无方块,将执行deep_first_search:move_x1或其他函数,该函数目的为向某个方向探索。


execute as @e[tag=dfsAS] at @s run tp @s ~1 ~ ~
function deep_first_search:search
execute as @e[tag=dfsAS] at @s unless block ~ ~-1 ~ blue_wool run tp @s ~-1 ~ ~



这是deep_first_search:move_x1函数的内容 move_x_1等函数内容相仿,在此不贴代码了



分析:
执行function deep_first_search:search
后,在盔甲架处放置了石头
放置石头能够阻止AS探寻走过的路径,引发死循环※
同时游戏发现只满足了第二条/execute的条件
于是执行了deep_first_search:move_x1函数
在该函数中AS向下移动(为便于分析以玩家视角为准)

同时再次执行function deep_first_search:search函数
于是再次判断,AS下移,以此类推
直到第一个岔口处
此时发现满足了向下和向右的条件
此时由于在search函数中,
先判断了向下再判断向右
于是先执行move_x1函数
一直到……

此时到达拐角处,由于满足向右而不满足向下,
AS不断前进,以此类推


到达了死路
即这条支路已到达尽头
刚才函数的调用层次是search调用move_x1,move_x1又调用search
到达如上图这种状态时,不再满足任何一个execute
于是该函数结束
类似地,该函数结束后回到move_x1,继续执行function deep_first_search:search之后的
execute as @e[tag=dfsAS] at @s unless block ~ ~-1 ~ blue_wool run tp @s ~-1 ~ ~于是AS原路返回
直到它来时的路上遇到的最后一个岔路口
即它回来时遇到的第一个岔路口
由于当时search函数里满足两个execute,一个执行完结束继续另一个
AS继续探寻另一条支路
……
……
……

它抵达了终点!
因为脚下是蓝羊毛,它不再返回
这就是
Deep first search,深度优先搜索
你是否对DFS有了初步的理解认知
不会的话再看一遍

度凉百科
什么是回溯?
回溯在这里指的不是某种特定算法,而是
在探寻一条支路后,原路返回到岔口,探寻另一条支路。

请等待作者更新



数据包:



在MC里生成一个带标签"dfsAS"的AS,放入一个闭合迷宫里输入/function deep_first_search:search
如果迷宫未闭合或没有终点(蓝色羊毛),听天(maxCommandChainLength)由命吧
鸣谢
SPGoding's Datapack Helper Plus
大憨批真的很好用!谢谢SPG!

所有在数据包方面帮助过我的玩家




请稍等如果作者还没死的话



ChapterII
本帖最后由 ChapterII 于 2020-5-15 21:42 编辑

自占一楼awaawaawa

自然_Hungteen
有丶意思,再来个BFS

下一页 最后一页