欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap FreeTalk
   您现在位于: 首页技术专栏开发语言 → 正文
一个简单的迷宫访问程序
08-08-15 16:48:21 作者:天方 出处:http://www.cnblogs.com/TianFang
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            int[,] i = {
                {0,0,1,0},
                {1,0,0,0},
                {1,0,0,0}
                };

            Maze m = new Maze(getdata(i));

            foreach (var item in m.Travel())
            {
                Console.WriteLine(item);
            }
        }

        static bool[,] getdata(int[,] d)
        {
            int h = d.GetLength(0);
            int w = d.GetLength(1);
            bool[,] info = new bool[h, w];
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    info[i, j] = (d[i, j] == 0);
                }
            }

            return info;
        }
    }

    enum Direction
    {
        Up, Down, Left, Right
    }

    class Point : IEquatable<Point>
    {
        public int X { get; private set; }
        public int Y { get; private set; }

        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }

        public override string ToString()
        {
            return string.Format("[{1},{0}]", X, Y);
        }

        #region IEquatable<Position> Members

        public bool Equals(Point other)
        {
            return this.X == other.X && this.Y == other.Y;
        }

        #endregion
    }

    class MazeItem
    {
        public Point Point { get; private set; }
        public bool Visitable { get; private set; }

        public MazeItem(int x, int y, bool canVisit)
        {
            Point = new Point(x, y);
            Visitable = canVisit;
        }

        public override string ToString()
        {
            return Point + "-" + Visitable;
        }
    }

    class Maze
    {
        public int Width { get; private set; }
        public int Height { get; private set; }

        MazeItem[,] data;

        MazeItem emptyItem = new MazeItem(-1, -1, false);

        public Maze(bool[,] array)
        {
            Height = array.GetLength(0);
            Width = array.GetLength(1);

            data = new MazeItem[Height, Width];
            for (int w = 0; w < Width; w++)
            {
                for (int h = 0; h < Height; h++)
                {
                    data[h, w] = new MazeItem(w, h, array[h, w]);
                }
            }
        }

        public IEnumerable<MazeItem> Travel()
        {
            var path = new List<MazeItem>();
            TryTravel(new Point(0, 0), path);
            return path;
        }

        MazeItem GetItem(Point point)
        {
            if (point.X >= Width || point.X < 0)
                return emptyItem;
            if (point.Y >= Height || point.Y < 0)
                return emptyItem;

            return data[point.Y, point.X];
        }

        IEnumerable<Direction> Directions()
        {
            yield return Direction.Up;
            yield return Direction.Down;
            yield return Direction.Left;
            yield return Direction.Right;
        }

        Point GetNextPoint(Point current, Direction direction)
        {
            switch (direction)
            {
                case Direction.Up:
                    return new Point(current.X, current.Y - 1);
                case Direction.Down:
                    return new Point(current.X, current.Y + 1);
                case Direction.Left:
                    return new Point(current.X - 1, current.Y);
                case Direction.Right:
                    return new Point(current.X + 1, current.Y);
                default:
                    return current;
            }
        }

        //
尝试将节点从pos的位置移动到终点,将新增的访问路径添加到visited中,如果无法访问则不能修改visited内容。
        //返回值表示是否可以从pos移动到终点
        bool TryTravel(Point pos, List<MazeItem> visited)
        {
            int len = visited.Count;

            visited.Add(GetItem(pos));
            if (pos.X == (Width - 1) && pos.Y == (Height - 1))
            {
                return true;
            }

            foreach (var direction in Directions())
            {
                Console.WriteLine(direction);
                Point npoint = GetNextPoint(pos, direction);

                MazeItem nItem = GetItem(npoint);
                if (!nItem.Visitable) //
新的节点是否可以访问
                    continue;
                if (visited.Contains(nItem)) //
已经访问过的路径不能再访问
                    continue;

                Console.WriteLine(pos + "-" + npoint);
                foreach (var item in visited)
                {
                    Console.Write(item.Point + "-");
                }
                Console.WriteLine();

                Console.ReadLine();

                if (TryTravel(npoint, visited))
                {
                    return true;
                }
                else
                {
                    //
无法访问,需要把新插入的访问路径去掉
                    visited.RemoveRange(len, visited.Count - len - 1);
                }
            }

            //
无法访问,需要把已经放入访问路径的pos去掉
            visited.RemoveAt(len);
            return false;
        }

    }
}

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
     
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.
     

                   滇ICP备05006901号