1

我必须编写一个程序来解决迷宫图像,我决定将图像传递给更容易阅读的东西,所以我将图像转换为二维数组,如下所示:
# : blackwalls
' : white spaces
R : the start (I知道在哪里读)
B:结束(我知道在哪里是蓝色)

问题是我用一个字符表示每个像素,所以我有一个 441 x 441 二维数组。这是我的问题:如何在不丢失迷宫比例的情况下简化二维数组中的元素数量?

我有这个:

 # # # # # # # 
 # ' ' ' ' ' ' ' ' '       
 # ' ' ' ' ' ' ' ' '       
 # ' ' ' ' ' ' ' ' '   

我想要这个

 # # # # # # # 
 #       
 # ' ' ' ' ' ' ' ' '       
 #  

我只想删除空格,这样我就不必检查每个空格,问题是我必须确定每列和每行必须删除多少空格(')。

4

3 回答 3

1

经过大量工作后,我能够使用 A* 算法解决问题,这是我的案例的解决方案,但有很多算法可用于解决迷宫图像:

http://en.wikipedia.org/wiki/Maze_solving_algorithm

于 2013-07-25T17:30:25.710 回答
0

以下是我如何实现 MazeMap 的关键部分。它是为六角网格设计的,因此连接性与正交网格略有不同。

public sealed class MazeMap : MapDisplay {
  protected override string[]   Board { get { return _board; } }
  string[] _board = new string[] {
    ".............|.........|.......|.........|.............",
       /* many similar lines omitted */
    ".............................|.......|.....|..........."
  };

  public override bool  IsPassable(ICoordsUser coords) { 
    return IsOnBoard(coords)  &&  this[coords].Elevation == 0; 
  }

  public override IMapGridHex this[ICoordsCanon coords] { 
    get {return this[coords.User];} 
  }
  public override IMapGridHex this[ICoordsUser  coords] { get {
    return new GridHex(Board[coords.Y][coords.X], coords);
  } }

  public struct GridHex : IMapGridHex {
    internal static MapDisplay MyBoard { get; set; }

    public GridHex(char value, ICoordsUser coords) : this() { Value = value; Coords = coords; }

    IBoard<IGridHex> IGridHex.Board           { get { return MyBoard; } }
    public IBoard<IMapGridHex> Board          { get { return MyBoard; } }
    public ICoordsUser         Coords         { get; private set; }
    public int                 Elevation      { get { return Value == '.' ? 0 : 1; } }
    public int                 ElevationASL   { get { return Elevation * 10;   } }
    public int                 HeightObserver { get { return ElevationASL + 1; } }
    public int                 HeightTarget   { get { return ElevationASL + 1; } }
    public int                 HeightTerrain  { get { return ElevationASL + (Value == '.' ? 0 : 10); } }
    public char                Value          { get; private set; }
    public IEnumerable<NeighbourHex> GetNeighbours() {
      var @this = this;
      return NeighbourHex.GetNeighbours(@this).Where(n=>@this.Board.IsOnBoard(n.Hex.Coords));
    }
  }
}

注意this大约一半的定义。这允许像结构数组一样访问 MaxeMap 的实例GridHex

ICoordsUser 和 ICoordsCanon 接口分别支持矩形或斜角(即 120 度的轴)的六角网格操作,并自动从一个转换到另一个;Point这在正交网格上是不必要的,在其中传递一个实例就足够了。

于 2013-04-29T04:40:54.287 回答
0

我不确定你到底要什么,但如果你想减小代表迷宫的数组的大小,你可以使用锯齿状数组。至少对于其中一个维度。请参阅http://msdn.microsoft.com/en-us/library/2s05feca(v=vs.110).aspx

然后,您可以将多个重复值替换为单个值和一个计数。

Original: 
 # # # # # # # 
 # ' ' ' ' ' ' ' ' '
 # ' ' ' ' ' ' ' ' '
 # ' ' ' ' ' ' ' ' ' 

Jagged:
 # 7
 # ' 9
 # ' 9
 # ' 9
于 2013-04-29T04:27:06.513 回答