连连看(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;        }
原创粉丝点击