复制构造函数 [数组] C++

copy constructor [array] C++

本文关键字:C++ 数组 构造函数 复制      更新时间:2023-10-16

所以我正在做一个益智游戏,我遇到了一个问题。我的董事会将在程序的稍后部分被打乱。我想在它被打乱之前制作一份副本,以便在我的游戏获胜条件下使用它。我的想法是每次用户移动磁贴时,将复制的板与打乱的板进行比较,以查看它们是否成功(获胜)。但是我有点不确定如何为板做复制构造函数。这是我所做的(没有按预期工作)。

   
 Board::Board(int userInput)
{
    this->gameSize = userInput;
    int zeroPos[2] = { 0, 0 };
    SetTileNumbers();
}
void Board::SetTileNumbers()
{
    const int sizeOfGame = gameSize;                        //Size given from user when the board was created.
    int tileNumber = 0;                                     //The value given to each Tile.Number.
    int row, column;
    boardOfTiles = new Tile* [sizeOfGame];
    for (int i = 0; i < sizeOfGame; i++)
    {
        boardOfTiles[i] = new Tile [sizeOfGame];            //The doublepointer is given an additional dimension
    }
    for (row = 0; row < sizeOfGame; row++)
    {
        for (column = 0; column < sizeOfGame; column++)
        {
            boardOfTiles[row][column].number = tileNumber;  //Loops that goes through the entirety to instantiate the board of tiles.
            tileNumber++;
        }
    }
}
void Board::SetTileNumbers(const Board& copy) 
{
    const int sizeOfGame = copy.gameSize;
    int row , column;
    boardOfTiles = new Tile*[sizeOfGame];
    for (int i = 0; i < sizeOfGame; i++)
    {
        boardOfTiles[i] = new Tile[sizeOfGame]; 
    }
    for (row = 0; row < sizeOfGame; row++)
    {
        for (column = 0; column < sizeOfGame; column++)
        {
            boardOfTiles[row][column].number = copy.boardOfTiles[row][column].number;
        }
    }
}
 

我希望

这听起来不是题外话,但除了复制构造函数之外,我认为您可能遇到不同的问题:您决定解决方案的方式非常低效。你浪费了CPU的时间,你浪费了内存。

对于比较两个NxN板的每一步都是无效的。您可以尝试不同的方法:为板上的每个位置分配一个数字,您知道解决方案是按特定顺序对数字进行排序。

对于 3x3 板,"THE"解决方案如下所示:

1 2 3
4 5 6
7 8 9

此外,2d 数组作为连续数组存储在内存中,您可以将解决方案视为数组:

1 2 3 4 5 6 7 8 9

任何其他安排都不代表解决办法。检查数组排序的天气是一个更容易解决的问题。最坏的情况是,您仍在查看 O(n^2) 以检查数组是否已排序但没有内存开销。另外,我相信您可以找到一种更有效的算法来检查数组是否排序。

我希望这有帮助...