遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

关于连连看算法

 

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

  定义节点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

 

 

posted on 2010-02-09 09:35  遗忘海岸  阅读(404)  评论(0编辑  收藏  举报