连连看(C#版)——搜索路径算法
来源:互联网 发布:黑河龙江网络 编辑:程序博客网 时间:2024/03/29 02:44
private void Search(int iCurX, int iCurY) //生成到目标点(广度搜索)的地图算法 { //没有碰到不可走的路 if (iMap[iCurX, iCurY] != 0) { iMapCli[iCurX, iCurY] = 1; //寻找路径——当前子图下是否有路 SearchMapCli(iClickX, iClickY); //找到了目标点 if ( iPass != 0 ) { queue.Clear(); queueArr.Clear(); return; } if (queue.Count != 0) { Point poi = new Point(); poi = queue.Dequeue(); //把周围的坐标进队列 EnQueuePeriphery(poi); //广度优先递归 Search(poi.X ,poi.Y); } } else if (queue.Count != 0 ) { Point poi = new Point(); poi = queue.Dequeue(); //广度优先递归 Search(poi.X ,poi.Y); } } private void SearchMapCli(int iCurX, int iCurY) //搜索是否有通路图算法 { //没有碰到不可走的路 and 已经走过的路 if (iMapCli[iCurX, iCurY] != 0 && iAssistMap[iCurX, iCurY] != 1 ) { iAssistMap[iCurX, iCurY] = 1; //当前位置到目标点会有几个拐角 int iInflexion = findInflexion(iCurX, iCurY, 1); // 如果大于设定的拐点数,停止搜索 if (iInflexion > 2) { iAssistMap[iCurX, iCurY] = 0; findInflexion(0, 0, -1); return; } //如果在2拐角内找到了目标点 if (iCurX == poLastTarget.X && iCurY == poLastTarget.Y) { int a = 0; //回溯 if (iInflexion == 0) { iPass = 3; } else { iPass = iInflexion; } //记录下拐角的俩个坐标,以便画连接线 for (int i = 0; i < dIndex - 2; i++) { if (poPosrecord[i].X != poPosrecord[i + 2].X && poPosrecord[i].Y != poPosrecord[i + 2].Y) { poSaveTwoPass[a].X = poPosrecord[i + 1].X; poSaveTwoPass[a].Y = poPosrecord[i + 1].Y; a++; } } } //递归遍历(上,右,下,左) SearchMapCli(iCurX, iCurY - 1); SearchMapCli(iCurX + 1, iCurY); SearchMapCli(iCurX, iCurY + 1); SearchMapCli(iCurX - 1, iCurY); iAssistMap[iCurX, iCurY] = 0; findInflexion(0, 0, -1); //返回上一个点 } } private int findInflexion(int x, int y,int Mode) //搜索拐角点数 { //记录下走到目标点的路径 poPosrecord[dIndex].X = x; poPosrecord[dIndex].Y = y; dIndex +=Mode; // Mode = 1 or 0 if (Mode == -1) { return 0; } int iInflexion = 0; //在3个点之间不可能有2个拐角,所以返回0 if(dIndex < 3) { return 0; } //走到当前点一共拐了几次角 for (int i = 0; i < dIndex-2; i++) { if (poPosrecord[i].X != poPosrecord[i + 2].X && poPosrecord[i].Y != poPosrecord[i + 2].Y) { iInflexion++; } } return iInflexion; }