2011-12-27 3 views
1

タイトルはほとんどの質問を説明します。
私は2D配列で表されるタイルグリッドを持っています。いくつかのタイルは、空であるとマークされます(ただし、それらはある継続的な使用のために配列に存在します)。他のタイルは通常の状態です。タイルマップ配列を使用して残りのタイル位置をランダムに並べ替えるロジック

グリッド内の残りの(空ではない)タイルを並べ替えると、すべてが(またはほとんど)がで、空ではないポジションになるようにする必要があります。私がすべての空でない位置を繰り返してタイルを別のランダムなものと入れ替えるだけで、私はすでにそれらの多くを自動的に並べ替えているかもしれません(スワップされたもの)。

私は、最小限のループで満足にグリッドを並べ替えることができるいくつかのテクニックがあるのだろうかと思っていました。何かヒント?

+1

ランダムにタイルを交換する必要がありますか?ランダム性が重要でない場合は、1を2,2、3、...、Nで1を1に置き換えて、タイルを1ステップ前に循環させることができます。ランダム性が重要な場合は、** derangement * *の元のタイルをランダムに生成する必要があります。 – templatetypedef

+0

はい、**脱線**は私が欲しいものです!空でないタイルを保存してランダムに配布するのではなく、インプレースでそれを行うことができるかどうか疑問に思っていました。そして、空でない位置だけを使うことができるので、マップからランダムな場所を選んで、空であるかどうかをチェックすることで、非生産的なチェックが多くなる可能性があります。 – eternalthinker

答えて

2
public void RandomizeGrid<T>(T[,] grid, Func<T,bool> isEmpty) 
{ 
    // Create a list of the indices of all non-empty cells. 
    var indices = new List<Point>(); 
    int width = grid.GetLength(0); 
    int height = grid.GetLength(1); 
    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      if (!isEmpty(grid[x,y])) // function to check emptiness 
      { 
       indices.Add(new Point(x,y)); 
      } 
     } 
    } 

    // Randomize the cells using the index-array as displacement. 
    int n = indices.Count; 
    var rnd = new Random(); 
    for (int i = 0; i < n; i++) 
    { 
     int j = rnd.Next(i,n); // Random index i <= j < n 
     if (i != j) 
     { 
      // Swap the two cells 
      var p1 = indices[i]; 
      var p2 = indices[j]; 
      var tmp = grid[p1.X,p1.Y]; 
      grid[p1.X,p1.Y] = grid[p2.X,p2.Y]; 
      grid[p2.X,p2.Y] = tmp; 
     } 
    } 
} 
0

すべての空でないタイルが他の空でないタイルと1回スワップされていることを確認するために、あなたのニーズを満たしていますか(「満足いく」とは少し曖昧ですか?

は、あなたがリストを持って言う:

(1,4,7,3,8,10) 

我々はリストのなインデックス

(0,1,2,3,4,5) 

を書き留めて、それをシャッフルする指数にNランダムスワップを行うことができます - おそらくいくつかの数字が移動し、いくつかはありません。

(5,1,3,2,4,0) 

これらのペアをスワップのシーケンスとして元のリストで実行します。あなたが奇数の要素を持っている場合

(8,10,3,7,1,4) 

は、残りは、リスト内の他の要素と交換されます。

+0

私は2D配列に取り組んでいます。 2Dインデックスを無作為化する方法(空ではない)に関する考えはありますか? – eternalthinker

+0

それらが2次元配列にあるという事実は、ポイントの横にあります。彼らは場所があるただのものです。 – Mikeb

関連する問題