迷宫寻路算法

迷宫问题:
在一个拥有墙壁和空地的迷宫中,输入终点和起点,有程序搜索可通路径。

解法思路:
从起点出发,先记录当前节点能探索的方向。然后依次向一个方向探索,直到这个方向不能继续探索再切换方向。如果当前位置所
有方向的探索均结束,却没有到达终点,则沿
路返回当前位置的前一个位置,并在此位置还
没有探索过的方向继续进行探索;直到所有可
能的路径都被探索到为止。为了保证在任何位置上都能原路返回,因此需要使用一个后进先出的存储结构来保存从
起点到当前位置的路径以及在路径上各位置还可能进行探索的方向。因此在迷宫问题中使用
堆栈是自然的。

迷宫

迷宫的二维数组模拟

其中1表示墙壁,0表示空地,*表示路径。
定义迷宫路格

private class Cell
{
    int x = 0; //单元所在行
    int y = 0; //单元所在列
    bool visited = false; //是否访问过
    char c = ' ';  //是墙('1')、可通路('0')或起点到终点的路径('*')
    public Cell(int x, int y, char c, bool visited)
    {
        this.x = x; this.y = y;
        this.c = c; this.visited = visited;
    }
}

伪代码描述:

while(堆栈不空){
  取出栈顶位置作为当前位置;
  如果 当前位置是终点,
    则 使用堆栈记录的路径标记从起点至终点的路径;
  否则{  按照向下、右、上、左的顺序将当前位置下一个可以探索的位置入栈;
    //从堆栈取出的探索方向顺序则是左、上、右、下
  如果 当前位置没四周均不可通
    则 当前位置出栈;
  }
}

代码描述:

while (!stack.isEmpty())
    {
        Cell current = (Cell)stack.peek();
        if (current == endCell)
        { //路径找到
            while (!stack.isEmpty())
            {
                Cell cell = (Cell)stack.pop();//沿路返回将路径上的单元设为*
                cell.c = '*';
                //堆栈中与 cell 相邻的单元才是路径的组成部分,除此之外,
                //堆栈中还有记录下来但是未继续向下探索的单元,
                //这些单元直接出栈
                while (!stack.isEmpty() && !isAdjoinCell((Cell)stack.peek(), cell)) stack.pop();
            }
            Console.WriteLine("找到从起点到终点的路径。");
            printMaze(cells);
            return;
        }
        else
        { //如果当前位置不是终点
            int x = current.x;
            int y = current.y;
            int count = 0;
            if (isValidWayCell(cells[x + 1][y]))
            { //向下
                stack.push(cells[x + 1][y]); cells[x + 1][y].visited = true; count++;
            }
            if (isValidWayCell(cells[x][y + 1]))
            { //向右
                stack.push(cells[x][y + 1]); cells[x][y + 1].visited = true; count++;
            }
            if (isValidWayCell(cells[x - 1][y]))
            { //向上
                stack.push(cells[x - 1][y]); cells[x - 1][y].visited = true; count++;
            }
            if (isValidWayCell(cells[x][y - 1]))
            { //向左
                stack.push(cells[x][y - 1]); cells[x][y - 1].visited = true; count++;
            }
            if (count == 0) stack.pop();//如果是死点,出栈
        }//end of if
    }//end of while

1.判断是否为当前点的相邻点

private bool isAdjoinCell(Cell cell1, Cell cell2)
{
    if (cell1.x == cell2.x && Math.abs(cell1.y - cell2.y) < 2) return true;
    if (cell1.y == cell2.y && Math.abs(cell1.x - cell2.x) < 2) return true;
    return false;
}

2.判断当前路格是否为空地且没走过

private boolean isValidWayCell(Cell cell){
  return cell.c=='0'&&!cell.visited;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容