2016-12-20 6 views
-1

Imこれを解決しようとすると膨大な時間がかかります。例に従って2d配列をソートする

どのように動作すると思われますか?基本的に、ユーザーは配列の長さと幅を入力します。そして配列上のXをどこで選ぶかを選びます。基本的には、掃海艇のゲームが好きです。ここに例があります!

Example #1 

Input 
1. 3 //length 
2. 5 //width 
3. {1} 
4. {1} 

Return 
{{X, 1, 2}, 
{1, 2, 3}, 
{2, 3, 4}, 
{3, 4, 5}, 
{4, 5, 6}} 

Example #2 
1. 5 
2. 7 
3. {2, 4} 
4. {3, 7} 

Return 
{{3, 2, 3, 4, 5} 
{2, 1, 2, 3, 4} 
{1, X, 1, 2, 3} 
{2, 1, 2, 3 ,4} 
{3, 2, 3, 2, 3} 
{4, 3, 2, 1, 2} 
{3, 2, 1, X ,1}} 

EDIT: More easy example 

input 3 length 
input 3 width 

cordinnates {1,1} 

Return 
{{X , 1 , 2} 
{1 , 2 , 3} 
{2 , 3 , 4}} 

EDIT:2つのブロック間の距離は(対角方向に動く2の距離従って考えられる) それらの水平及び垂直距離の和です。

これは私のコードです!私は各数字のXまでの距離を計算する方法を理解できません!ヘルプ/ヒント?

public static int[][] getMapGrid(int cityLength, int cityWidth, int XCoordinates, int YCoordinates) 
     { 
      int contador = 0; 
      bool vira = false; 
      int[,] city = new int[cityLength,cityWidth]; 
      Console.WriteLine(city.Length); 
      contador = cityWidth; 
      city[XCoordinates, YCoordinates] = X; 
      for (int a = 0; a < cityLength; a++) 
      { 
       for (int b = 0; b < cityWidth; b++) 
       { 
        if (XCoordinates != b && YCoordinates != a) 
        { 
         if (vira != true) 
         { 
          city[a, b] = contador; 
          contador--; 
         } 
         else 
         { 
          contador++; 
          city[a, b] = contador; 
         } 
        } 
        else 
        { 
         vira = true; 
        } 
        Console.Write(city[a, b]); 
       } 
       Console.WriteLine(); 

      } 

      Console.ReadLine(); 
      return null; 
     } 
+0

どのように距離を定義していますか? – itsme86

+0

私は本当にそれを定義する場所を知っていません...本当にどのように知っている! –

+1

さて、あなたはXまでの距離を求めています。それは、仮想的な距離か、Xに到達するためにジャンプする必要があるセルの数ですか?そしてそれが細胞の数であれば、斜めジャンプが許されますか?誰かがあなたを助ける前にこれを理解する必要があります。 – itsme86

答えて

1

まず、方法はint[][]です。幅と高さを設定しているので、ギザギザの配列(例えばint[,])ではなく正方形の配列を使用して最適化することができます。 (あなたのコードは正方形の配列を実際に使用していることが分かりますので、後でなく早く修正する必要があります)。

第2に、入力座標は1ベースのようです{1,1}です)。あなたの健全性のために、使用する配列は0ベースであるため、代わりに0ベースのインデックスを使用することをお勧めします。さもなければ、それらを使用するたびにあなたの座標をオフセットする必要があり、コードを不必要な冗長さで駄目にします。

第3に、ポイントからの各タイルの距離を決定するために複雑な経路探索を使用する必要はありません。各点は既知であり、マップは均一なデカルト格子上にあり、いずれのタイルも障害物や旅行修飾子のような追加のヒューリスティックを導入しません。この場合、選択したタイルから最も近い指定されたポイントまでのManhatten Distanceの簡単な計算を行うだけです。

public int[,] BuildMap(int w, int h, int[] xList, int[] yList) 
{ 
    if (xList.Length == 0) 
     throw new ArgumentException("at least one coordinate pair must be supplied"); 
    if (xList.Length != yList.Length) 
     throw new ArgumentException("coordinate lists must have equal length"); 

    int[,] map = new int[w, h]; 

    // Iterate over each map tile 
    for (int x = 0; x < w; x++) 
    { 
     for (int y = 0; y < h; y++) 
     { 
      // Set storage variable 
      int temp = int.MaxValue; 

      // Iterate over each point in x/y lists 
      for (int idx = 0; idx < xList.Length; idx++) 
      { 
       // Find the nearest point 
       // Distance = |x - px| + |y - py| 
       temp = Math.Min(Math.Abs(x - xList[idx]) + Math.Abs(y - yList[idx]), temp); 
      } 

      // Assign the shortest distance 
      map[x, y] = temp; 
     } 
    } 

    return map; 
} 
関連する問題