交换二维数组中的两个值

Swapping two values within a 2D array

本文关键字:两个 二维数组 交换      更新时间:2023-10-16

我目前正在做一项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函数中?这个过程目前在我的脑海中没有连接。

我很感激任何一点点帮助。

如果你只是要求交换函数,你可以使用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++不知道你是在交换两个矩阵单元还是两个数组元素,它只知道你在交换特定类型的两个内存块。

一个基本的交换概念(C++11之前)是持有一个临时变量。仅仅

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

因此,您不需要引用blankRowblankCol,只需要引用网格上的值即可。比方说,你想用(2, 2)交换你知道的位于(2, 1)的空白。。。

swap(originalBoard[2][1], originalBoard[2][2]);

将在originalBoard内交换值。

如果您使用的是C++11或更高版本,只需使用std::swap()来交换位置。这正是它的作用。

如果你想让originalBoard在一个完全不同的板上是不可变的,那么在应用开关之前先复制它。