首页 > 解决方案 > 使用函数洗牌矩阵(C++)

问题描述

我正在编写一个使用函数创建 10x10 矩阵的代码,它也使用函数进行打印。我目前正在制作一个函数,它将洗牌矩阵的内容并使用一个函数来洗牌矩阵并使用相同的函数来打印第一个矩阵以打印出洗牌矩阵。我认为我的代码遇到的问题是,每当我打印矩阵时,它实际上并不是在洗牌,而是实际上打印出一个全新的矩阵。我尝试的是在函数中调用函数,但这似乎不起作用。

这是我的代码:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>

using namespace std;

const int ROW_SIZE = 10;
const int COLUMN_SIZE = 10;

void initialize(int [][10], int, int);
void display(int matrix[][10], int, int);
void shuffle(int matrix[][COLUMN_SIZE], int, int);


int main() {

    int matrix [ROW_SIZE][COLUMN_SIZE];

    initialize(matrix, ROW_SIZE, COLUMN_SIZE);

    display(matrix, ROW_SIZE,COLUMN_SIZE);

    shuffle(matrix, ROW_SIZE, COLUMN_SIZE);

    display(matrix, ROW_SIZE,COLUMN_SIZE);




    return 0;
}


void initialize(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    for (int i = 0; i < ROW_SIZE; i++){
        for(int j = 0; j < COLUMN_SIZE; j++){
            matrix[i][j] =  1 + rand() % 99;
        }
    }
}


void display(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    for(int i = 0; i < ROW_SIZE; i++){
        for(int j = 0; j < COLUMN_SIZE; j++){
            cout<< setw(4)<<matrix[i][j]<< " ";
        }
         cout<< endl;
    }
}



void shuffle(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    for (int i = 0; i < ROW_SIZE; i++) { 
        for(int j = 0; j < COLUMN_SIZE; j++){
    swap(matrix[i],matrix[j]); 
        } 
    }
}

标签: c++arraysfunctionloopsmatrix

解决方案


你的洗牌算法是错误的。它还假设行数与列数相同,如果不是,则会调用未定义的行为。它所做的一切都是通过矩阵与反向对应物交换整行。但是在进行了一半的迭代之后,它会在下半场将它们交换回来。它也不会对列进行任何交换。

您需要设置一个随机行和列选择器,然后将该位置与matrix[i][j]. 完整的代码,包括用于设置序列矩阵的初始化程序的修改版本(从而在视觉上驱动 shuffle 的结果)如下:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>
#include <random>

using namespace std;

const int ROW_SIZE = 10;
const int COLUMN_SIZE = 10;

void initialize(int [][10], int, int);
void display(int matrix[][10], int, int);
void shuffle(int matrix[][COLUMN_SIZE], int, int);


int main() {

    int matrix [ROW_SIZE][COLUMN_SIZE];

    initialize(matrix, ROW_SIZE, COLUMN_SIZE);

    display(matrix, ROW_SIZE,COLUMN_SIZE);

    shuffle(matrix, ROW_SIZE, COLUMN_SIZE);

    display(matrix, ROW_SIZE,COLUMN_SIZE);




    return 0;
}


void initialize(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    int x = 0;
    for (int i = 0; i < ROW_SIZE; i++){
        for(int j = 0; j < COLUMN_SIZE; j++){
            matrix[i][j] =  ++x;
        }
    }
}


void display(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    for(int i = 0; i < ROW_SIZE; i++){
        for(int j = 0; j < COLUMN_SIZE; j++){
            cout<< setw(4)<<matrix[i][j]<< " ";
        }
         cout<< endl;
    }
    cout << endl;
}



void shuffle(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
    
    std::mt19937 prng{ std::random_device{}() };
    std::uniform_int_distribution<> rdist(0, ROW_SIZE-1);
    std::uniform_int_distribution<> cdist(0, COLUMN_SIZE-1);

    for (int i = 0; i < ROW_SIZE; i++) { 
        for(int j = 0; j < COLUMN_SIZE; j++){
            int x = rdist(prng);
            int y = cdist(prng);
            std::swap(matrix[x][y], matrix[i][j]);
        } 
    }
}

输出(显然不同)

   1    2    3    4    5    6    7    8    9   10 
  11   12   13   14   15   16   17   18   19   20 
  21   22   23   24   25   26   27   28   29   30 
  31   32   33   34   35   36   37   38   39   40 
  41   42   43   44   45   46   47   48   49   50 
  51   52   53   54   55   56   57   58   59   60 
  61   62   63   64   65   66   67   68   69   70 
  71   72   73   74   75   76   77   78   79   80 
  81   82   83   84   85   86   87   88   89   90 
  91   92   93   94   95   96   97   98   99  100 

  36   22   28   32   47   29    2   65   10   48 
  76   86   64   56   25    8   91   70   75    6 
  52   40   87   97   23    9   53   39   59   74 
  84   61   43    3   38   69   60   81   83   42 
  19   72   49   67   27   80   44   55   18   16 
  96   37   46   79    4   12   17   41   11   30 
  73   66   71   14   54   77   57   45   88   93 
  63   89  100   33   58   50   85   95   68   26 
  34   35    7    1   51   92   21   90   15   99 
  94   24   62   13   82   31   78    5   20   98

推荐阅读