迷宫图像2d阵列的问题

时间:2013-04-29 01:04:05

标签: c# arrays image-processing

我必须编写一个程序来解决迷宫图像,我决定将图像传递给更容易阅读的内容,因此我将图像转换为2D数组,如下所示:
 #:blackwalls
':白色空间
R:开始(我知道在哪里读取)
B:结束(我知道在哪里,是蓝色)

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

我有这个:

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

我想要这个

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

然后,您可以使用单个值和计数替换多个重复值。

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

Jagged:
 # 7
 # ' 9
 # ' 9
 # ' 9

答案 2 :(得分: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实例就足够了。