我必须编写一个程序来解决迷宫图像,我决定将图像传递给更容易阅读的内容,因此我将图像转换为2D数组,如下所示:
#:blackwalls
':白色空间
R:开始(我知道在哪里读取)
B:结束(我知道在哪里,是蓝色)
问题是我代表了一个字符中的每个像素,所以我有一个441 x 441 2d数组。
在这里我的questino:如何在不丢失迷宫比例的情况下简化二维数组中的元素数量?
我有这个:
# # # # # # #
# ' ' ' ' ' ' ' ' '
# ' ' ' ' ' ' ' ' '
# ' ' ' ' ' ' ' ' '
我想要这个
# # # # # # #
#
# ' ' ' ' ' ' ' ' '
#
我只想删除白色空格,这样我就不必检查每个空格,问题是我必须确定每个列和每行要删除多少空格(')。 / p>
答案 0 :(得分:1)
经过大量的工作,我能够通过使用A *算法解决问题,这是我的案例的解决方案,但有很多算法可用于解决迷宫图像:
答案 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
实例就足够了。