2017-02-06 17 views
-1

私は現在、15個のパズルプログラミング割り当てに取り組んでいます。ここで私の質問は、隣接するタイルと空のタイルを交換する方法についてです。2次元配列内の2つの値を交換する

たとえば、最初のセットアップボードを見てみましょう。 私が持っている:

int originalBoard[4][4] = { 
       {1 , 2, 3, 4}, 
       {5 , 6, 7, 8}, 
       {9 ,10,11,12}, 
       {13,14,15, 0}}; 

をので、ここで、アレイ内の12、15、及び0(空のタイル)の位置である[3] [4]、[4] [3]、[4] [4]である。 12と15のどちらかで0を交換する方法は何でしょうか?

私が気にしていたのは、移動するたびに空のタイルを追跡するループを作成することでした。

私は、最適な方法は2つの機能を持つことだと思います。 1は空のタイルの位置を更新し、1は移動を行います。

だから、私が持っているだろう、右私の頭の上から:

void locateEmptyTile(int& blankRow, int& blankColumn, int originalBoard[4][4]) 
{ 
    for (int row = 0; row < 4; row++) 
    { 
     for (int col = 0; col < 4; col++) 
     { 
      if (originalBoard[row][col] == 0) 
      { 
       blankRow = row; 
       blankColumn = col; 
      } 
     } 
    } 
} 

void move(int& blankRow, int& blankColumn, int originalBoard[4][4]) 
{ 

} 

そして、私のmain機能で、私は変数を持っています:int blankRow

int blankColumnを今、どのように私はそのデータを取るだろうlocateEmptyTileからmoveファンクションに関連する実際の方法で適用しますか?このプロセスは現在、私の頭の中でつながっていません。

少し助けていただきありがとうございます。

#include <algorithm> // until c++11 
#include <utility> // since c++11 

... 
int m[3][3]; 
... 
//somewhere in the code 
std::swap(m[i][j], m[j][i]); // this swaps contents of two matrix cells 
... 

それとも、(例えば、int型aとint型b)において、二つの変数の内容を交換する場所あなただけ書くことができます:

+0

インデックスには注意してください。 C++配列はゼロベースなので、[3] [4]、[4] [3]はあなたが思っているものではなく、[4] [4]は範囲外です。 – acraig5075

+0

'locateEmptyTileあなたは2、3、または4つの可能な隣接セルを交換することになります。スワッピングの可能なターゲットを計算する必要があります。次に、 'move'メソッドが2つのセルの位置を入れ替えてスワップさせるようにします。 – acraig5075

答えて

1

基本スワップの概念(pre-C++ 11)は一時変数を保持しています。単に...

template<typename T, typename U> 
void swap(T& lhs, U& rhs) { 
    T t = lhs; 
    lhs = rhs; 
    rhs = t; 
} 

だから、あなたはあなただけのグリッド上の値を参照する必要があり、blankRowblankColを参照する必要はありません。originalBoard内の値を交換します...

...あなたが(2, 2)(2, 1)に位置空白になって知っていることを入れ替えたいことを言うことができます。

C++ 11以降を使用している場合は、位置を入れ替えるのにstd::swap()を使用してください。それはまさにそれがすることです。

originalBoardを完全に別のボードに変更できないようにするには、スイッチを適用する前に最初にコピーしてください。

+0

それはトリックでした、ありがとうございました。 – Xankar

2

あなただけのスワップ機能を求めているなら、あなたはstd::swap使用することができます

をあなたは2個の母細胞または2つの配列の要素を交換している場合は、スワップを見ることができるように
int temp = a; 
a = b; 
b = temp; 

は、通常の配列と同じである、C++はそれだけであなたが特定のタイプの2つのメモリブロックをスワップしていることを知っている、知りません。

+0

これは役に立ちました、ありがとうございました。 – Xankar