博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
栈和队列 迷宫求解
阅读量:5092 次
发布时间:2019-06-13

本文共 2951 字,大约阅读时间需要 9 分钟。

用WPF做演示

1.用Stack记录和回溯

在现实生活中,在你迷路的时候,总是记录一些可记忆的建筑物作为返回的标志(比如你出去玩,总得回家的吧,那么就得记得回家的路)

(1)画迷宫

public class MazeElement : FrameworkElement{    public MazeElement(int[,] mg)    {        this.mg = mg;    }    int[,] mg=null;    protected override void OnRender(DrawingContext dc)    {        var width = 40;        dc.DrawRectangle(Brushes.Black, null, new Rect(0, 0, 10 * width, 10 * width));        for (int i = 0; i < 10; i++)        {            for (int j = 0; j < 10; j++)            {                if (mg[i, j] == 1)                {                    dc.DrawRectangle(Brushes.Gray, null, new Rect(j * (width), i * (width), width - 1, width - 1));                }                else                {                    dc.DrawRectangle(Brushes.White, null, new Rect(j * (width), i * (width), width - 1, width - 1));                }            }        }    }}

(2)白色表示可以通过的坐标,从坐标1,1寻找坐标(8,8)点

一个块的的数据结构如下,即坐标点加下个可寻找点的方向

public class Block{    public Point Point { get; set; }    public int Direction { get; set; }}

(3)若找到的下个是白点且没有重复的话,则继续寻找,否则就回溯,找另外的出口,其实就是穷举法了…

算法如下

public void MgPath(Point start, Point end){    Block temp = null;    bool find = false;    while (st.Count > 0)    {        temp = st.Peek();        _point = temp.Point;        Console.WriteLine(temp.Point.ToString());        var point = temp.Point;        var di = temp.Direction;        //UI Refresh don't care        System.Threading.Thread.Sleep(100);        Dispatcher.BeginInvoke(new Action(() =>        {            this.InvalidateVisual();        }), DispatcherPriority.Render);        if (point.Equals(end))        {            finished = true;            break;        }        //not find        find = false;        //find next block        while (di < 4 && !find)        {            di++;            switch (di)            {                case 0://top                    point.Y = temp.Point.Y - 1;                    point.X = temp.Point.X;                    break;                case 1://right                    point.X = temp.Point.X + 1;                    point.Y = temp.Point.Y;                    break;                case 2://bottom                    point.Y = temp.Point.Y + 1;                    point.X = temp.Point.X;                    break;                case 3://left                    point.X = temp.Point.X - 1;                    point.Y = temp.Point.Y;                    break;            }            if (mg[(int)point.X, (int)point.Y] == 0) find = true;        }        //if find        if (find)        {            temp.Direction = di;            st.Push(new Block() { Point = point, Direction = -1 });            //mark already visit            mg[(int)point.X, (int)point.Y] = -1;        }        else        {            //not find            mg[(int)temp.Point.X, (int)temp.Point.Y] = 0;            st.Pop();        }        break;    }}

这个例子还是发上源码吧,做演示用

转载于:https://www.cnblogs.com/Clingingboy/archive/2011/01/02/1924091.html

你可能感兴趣的文章
Js/Jquery获取input file的文件名
查看>>
51Nod 1109 01组成的N的倍数
查看>>
js-Date()对象,get/setFullYear(),getDay()编程练习
查看>>
Oracle_视图_索引_plsql_游标_存储过程_存储函数_触发器
查看>>
足球——2011-2012意甲球队队标
查看>>
IE7 绝对定位z-index问题
查看>>
Cogs 2221. [SDOI2016 Round1] 数字配对(二分图)
查看>>
菜鸟学习Dubbo
查看>>
Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
查看>>
树莓派GPIO点亮第一个led
查看>>
ping 和 远程桌面 与防火墙的关系
查看>>
shell 命令 netstat 查看端口占用
查看>>
如何防止JAVA反射对单例类的攻击?
查看>>
Design Patterns
查看>>
angular动态绑定样式以及改变UI框架样式的方法
查看>>
VirtualBox6.0安装及配置
查看>>
微信接口 微信分享带图片、标题、描述 JAVA
查看>>
Java之数据库基础理论
查看>>
AutoLayout的那些事儿
查看>>
docker 容器中设置 mysql lampp php软链接
查看>>