主权项 |
一种基于3D DFS迷宫的数字置乱方法,其特征在于包括以下步骤:第1步:设定迷宫初始范围S<sub>init</sub>=()<sub>m×n×l</sub>和迷宫有效区域S<sub>maze</sub>=(s<sub>i,j,k</sub>)<sub>m×n×l</sub>,对于<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><msub><mrow><mo>∀</mo><mi>s</mi></mrow><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>,</mo><mi>k</mi></mrow></msub><mo>,</mo><mi>i</mi><mo>=</mo><mn>0</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>m</mi><mo>-</mo><mn>1</mn><mo>,</mo><mi>j</mi><mo>=</mo><mn>0</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>n</mi><mo>-</mo><mn>1</mn><mo>,</mo><mi>k</mi><mo>=</mo><mn>0</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>l</mi><mo>-</mo><mn>1</mn><mo>,</mo></mrow>]]></math><img file="FDA0000627801790000014.GIF" wi="1098" he="90" /></maths>若<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><msub><mi>s</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>,</mo><mi>k</mi></mrow></msub><mo>∉</mo><msub><mi>S</mi><mi>maze</mi></msub><mo>,</mo></mrow>]]></math><img file="FDA0000627801790000015.GIF" wi="285" he="86" /></maths>则标记s<sub>i,j,k</sub>=‑1,反之则标记S<sub>i,j,k</sub>=0表示该节点未访问,若s<sub>i,j,k</sub>>0表示该节点已访问;第2步:对于<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><msub><mrow><mo>∀</mo><mi>s</mi></mrow><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>,</mo><mi>k</mi></mrow></msub><mo>∈</mo><msub><mi>S</mi><mi>maze</mi></msub><mo>,</mo><mi>i</mi><mo>=</mo><mn>0</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>m</mi><mo>-</mo><mn>1</mn><mi>j</mi><mo>=</mo><mn>0</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>n</mi><mo>-</mo><mn>1</mn><mo>,</mo><mi>k</mi><mo>=</mo><mn>0</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mi>l</mi><mo>-</mo><mn>1</mn><mo>,</mo></mrow>]]></math><img file="FDA0000627801790000013.GIF" wi="1270" he="99" /></maths>记s<sub>i,j,k</sub>.d,d=0,1,2,3,4,5依次为节点s<sub>i,j,k</sub>的下方、右方、上方、左方、底部和顶部墙,初始化s<sub>i,j,k</sub>.d=‑1,d=0,1,2,3,4,5,即将S<sub>maze</sub>范围内的所有节点以墙进行分隔,s<sub>i,j,k</sub>.d=‑1表示有墙,s<sub>i,j,k</sub>.d=0表示无墙;第3步:选择随机数发生器y=RG(x),设定随机数发生器初始值RG.init=seed,初始化堆栈Stack=Φ,置节点更新序列A<sub>update</sub>=Φ;第4步:随机选取<img file="FDA0000627801790000011.GIF" wi="748" he="85" />标记s<sub>x,y,z</sub>=1,将S<sub>x,y,z</sub>的(x,y,z)加入节点更新序列A<sub>update</sub>=A<sub>update</sub>.add((x,y,z));第5步:若s<sub>x,y,z</sub>的周围相邻节点s<sub>x+1,y,z</sub>,s<sub>x,y+1,z</sub>,s<sub>x‑1,y,z</sub>,s<sub>x,y‑1,z</sub>,s<sub>x,y,z‑1</sub>,s<sub>x,y,z+1</sub>存在S<sub>maze</sub>范围内未访问的节点,则随机选择1个未访问的节点,记为s<sub>x′,y′,z′</sub>,将s<sub>x,y,z</sub>和s<sub>x′,y′,z′</sub>之间的分割墙标记为0,将s<sub>x,y,z</sub>入栈push(Stack,s<sub>x,y,z</sub>),更新x=x′,y=y′,z=z′,标记s<sub>x,y,z</sub>=1,将(x,y,z)加入节点更新序列A<sub>update</sub>=A<sub>update</sub>.add((x,y,z));第6步:若s<sub>x,y,z</sub>的周围相邻节点s<sub>x+1,y,z</sub>,s<sub>x,y+1,z</sub>,s<sub>x‑1,y,z</sub>,s<sub>x,y‑1,z</sub>,s<sub>x,y,z‑1</sub>,s<sub>x,y,z+1</sub>不存在S<sub>maze</sub>范围内未访问的节点,则将栈顶元素出栈作为当前节点,即s<sub>x,y,z</sub>=pop(Stack);第7步:反复执行第5~6步,直至Stack=Φ;第8步:利用A<sub>update</sub>构造S<sub>maze</sub>=(s<sub>i,j,k</sub>)<sub>m×n×l</sub>范围内所有节点间的映射关系,从而将S<sub>maze</sub>=(s<sub>i,j,k</sub>)<sub>m×n×l</sub>范围内所有节点置乱。 |