在2D数组中交换两个值

时间:2017-02-06 06:21:57

标签: c++ arrays function

我目前正致力于15个拼图编程任务。我的问题是关于如何用相邻的瓷砖交换空的瓷砖。

因此,例如,让我们使用初始设置板。 我有:

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的方法?

我想到的是创建一个循环,每次我移动时都会跟踪空白区块。

我认为最佳方法是拥有两个功能。 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 blankRowint blankColumn

现在,我如何从locateEmptyTile获取数据并以相关的实际方式将其应用到move函数中?这个过程目前并不在我的脑海里。

我很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

如果您只是要求交换功能,可以使用std::swap

#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):

int temp = a;
a = b;
b = temp;

正如您所看到的,交换与普通数组相同,c ++不知道您是交换两个矩阵单元还是两个数组元素,它只知道您正在交换具有特定类型的两个内存块。

答案 1 :(得分:1)

基本交换概念(pre-C ++ 11)是一个临时变量。简单地...

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

因此,您不需要引用blankRowblankCol,您只需要引用网格上的值。假设您要将(2, 1)(2, 2)的空白位置交换为swap(originalBoard[2][1], originalBoard[2][2]); ...

originalBoard

...将在 std::swap()内交换值

如果您使用的是C ++ 11或更高版本,请使用originalBoard来交换位置。这正是它的作用。

如果您希望this在一个完全不同的电路板中不可变,请在应用开关之前先复制它。