1

迷路の画像を解くプログラムを作成する必要があり、画像をより読みやすいものに渡すことにしたので、次のように画像を 2D 配列に変換します。
# : blackwalls
' : 空白
R : 開始 (
B : 終わり (どこがどこで、どこが青か知っている)

問題は、各ピクセルを文字で表現したため、441 x 441 の 2d 配列があることです。ここで私の質問:迷路の比率を失うことなく、2次元配列の要素数を単純化するにはどうすればよいですか?

私はこれを持っています:

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

そして私はこれが欲しい

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

空白のみを削除したいので、各スペースをチェックする必要はありません。問題は、各列と各行で削除する必要がある空白(')の量を決定する必要があることです。

4

3 に答える 3

0

以下は、MazeMap の実装方法の重要な部分です。これは 16 進グリッド用に設計されているため、接続は直交グリッドからわずかにずれています。

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

何を求めているのか正確にはわかりませんが、迷路を表す配列のサイズを縮小しようとしている場合は、ギザギザの配列を使用できます。少なくとも 1 つのディメンションについて。http://msdn.microsoft.com/en-us/library/2s05feca(v=vs.110).aspxを参照してください。

その後、複数の繰り返し値を 1 つの値とカウントに置き換えることができます。

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

Jagged:
 # 7
 # ' 9
 # ' 9
 # ' 9
于 2013-04-29T04:27:06.513 に答える