我目前正致力于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 blankRow
和int blankColumn
现在,我如何从locateEmptyTile
获取数据并以相关的实际方式将其应用到move
函数中?这个过程目前并不在我的脑海里。
我很感激任何帮助。
答案 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;
}
因此,您不需要引用blankRow
和blankCol
,您只需要引用网格上的值。假设您要将(2, 1)
与(2, 2)
的空白位置交换为swap(originalBoard[2][1], originalBoard[2][2]);
...
originalBoard
...将在 std::swap()
内交换值。
如果您使用的是C ++ 11或更高版本,请使用originalBoard
来交换位置。这正是它的作用。
如果您希望this
在一个完全不同的电路板中不可变,请在应用开关之前先复制它。