关于连连看算法
连连看寻路时,使用回溯法进行逐步测试,如果发现某条路不行,则退一步再进行尝试,可以使用递归来实现,递归方式代码比较自然,另外也可以使用栈来实现,以下是一些实现思路:
定义节点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