zoukankan      html  css  js  c++  java
  • 关于连连看算法

      连连看寻路时,使用回溯法进行逐步测试,如果发现某条路不行,则退一步再进行尝试,可以使用递归来实现,递归方式代码比较自然,另外也可以使用栈来实现,以下是一些实现思路:

      定义节点Node, Node包含左,右,上,下四个标志,表示这个节点是否进行了4个位置的寻路尝试.

     1. 首先将开始节点压入栈.

     2.判断栈是否为空.

     3.然后Peek栈顶节点的node_x.

       3.1判断nodex_x的四个点是否存在目标节点,如果存在则寻路成功,跳到步骤4.

       3.2如果node_x四个点存在通路(可行节点--已经消掉的方块)则将这个相邻的节点nodex_x_x压入栈,跳到步骤2.

       3.3如果node_x四个点多已经测试过了不是目标节点或不是可行点,那么则弹出node_x,跳到步骤2.

     4.栈变为空则表示无法找到有效路径,不为空时栈里的节点就是具体路线.

      stack.Push(node_start)

      while(stack.Count>0){

       node_x=stack.Peek();

      if(node_x.Top){

        /*TestTop*/

       }else if(node_x.Left){

       /*TestLeft*/

       }else if(node_x.Right){

       /*TestRight*/

       }else if(node_x.Bottom){

       /*TestBottom*/

       }else{

       /*四个节点都不可行则弹出栈*/

        stack.Pop();

        }

      }

    /*

      说明:Testxxx 代码段会处理三种情况

      1. 判断邻近一节点是否是目标节,是的话则将节点压入栈然后跳出循环(break;)

      2.邻近点是可行节点(已经消掉的方块),
         2.1标记节点node_x        (node_x.L|T|B|L=false;)

         2.2标记节点node_x_x(node_x_x.R|B|T|R=false;) 具体取决于node_x是那个方向过来的,如果是Right过来则将node_x_x.Left设置成false以避免死循环);

         2.3将这个节点(node_x_x)压入栈继续循环.(continue;)

      3.不可行节点(未消除的方块,或到了边界)那么将对应的Top|Left|Bottom|Right标记成false;

     注意:2.1跟2.2步骤都没标记的话则产生死循环,而只标记2.1没标记2.2的话则会生进行一些多余的比较("原路回测")使最终结果无法确定(可能是错误的结果),而标记2.2没标记2.1时会出现死循环(某个消除了的节点反复进栈出栈),各种情况自己画图找出.

    */

    //===================

    参考文章:

    限两个拐角

    http://www2.flash8.net/teach/4927.htm

  • 相关阅读:
    03 Python之变量以及常量介绍
    看女程序员是如何处理男友出轨,网友回复更精彩
    四面美团,收割 offer
    MySQL 优化实战记录
    龙岗一个月350的出租房,我搬出来了
    程序员工作 996 生病 ICU ?
    真的有人在偷听我们讲话么?
    一次非常有趣的 SQL 优化经历
    如何阅读Java源码?
    从 0 开始手写一个 Mybatis 框架,三步搞定!
  • 原文地址:https://www.cnblogs.com/wdfrog/p/1666221.html
Copyright © 2011-2022 走看看