Algorithm 如何对数字数组进行排序以生成分散的数字?

Algorithm 如何对数字数组进行排序以生成分散的数字?,algorithm,sorting,math,Algorithm,Sorting,Math,有一个数字数组。有些数字重复2到6次。我怎样才能分散那些重复的数字,使它们不能站在一起? 每个内部阵列最多可以有4个数字 [ [54, 23, 23, 23], [12, 12, 66, 66], [66, 66, 08, 43], [43, 43, 99, 00], [32, 54, 27, 73], [93, 51, 71, 39] ] 好的。解决这个问题花了很长时间 这里有一个方法。虽然可能有几种技术可以解决这个问题,但我认为这个解决方案很容易理解 将所有元素排序

有一个数字数组。有些数字重复2到6次。我怎样才能分散那些重复的数字,使它们不能站在一起? 每个内部阵列最多可以有4个数字

[
  [54, 23, 23, 23],
  [12, 12, 66, 66],
  [66, 66, 08, 43],
  [43, 43, 99, 00],
  [32, 54, 27, 73],
  [93, 51, 71, 39]
]

好的。解决这个问题花了很长时间

这里有一个方法。虽然可能有几种技术可以解决这个问题,但我认为这个解决方案很容易理解

将所有元素排序到另一个数组中。 定义r=0,c=0。 从数组中选取每个元素,然后尝试将其放置在矩阵中。如果不可能,则尝试下一个位置

int n = matrix.size();
int m = matrix[0].size();

vector<int> arr;
for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++) {
        arr.push_back(matrix[i][j]);
    }
}
sort(arr.begin(), arr.end());
int dr[] = {-1, 0, 1, 0}; /// 4 sides
int dc[] = {0, 1, 0, -1}; /// 4 sides
int r = 0, c = 0;
int new_matrix[n][m];
for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++)
        new_matrix[i][j] = -1;
}
bool vis[n][m] = {false};
for(int k = 0; k < n*m; ) {
    int cur_num = arr[k];
    bool check = false;
    if(!vis[r][c]) {
        for(int p = 0; p < 4; p++) {
            int adjr = r + dr[p];
            int adjc = c + dc[p];
            if(adjr < 0 || adjr >= n || adjc < 0 || adjc >= m) continue;
            if(new_matrix[adjr][adjc] == cur_num) check = true;
        }
        if(check == false) {
            new_matrix[r][c] = cur_num;
            vis[r][c] = true;
            k++;
        }
    }
    c++;
    if(c >= m) r++, c = c % m;
    if(r >= n) r = r % n;
}
for(int i = 0; i < n; i++) {
    for(int j = 0; j < m; j++) {
        cout<<new_matrix[i][j]<<" ";
    }
    cout<<endl;
}

快乐编码

首先,你必须准确地定义你所说的“不站”是什么意思together@user3386109例如,将4-9个元素放在同一个数字的较远处。有些数字重复2到6次。。这是什么意思?在完整矩阵中2到6次?不站在一起意味着不与行和列相邻?@Farukhosain yesIt花了很长时间将其翻译为JS真的,谢谢!此解决方案解决了任务BTW,此解决方案也按行和列进行排序。排序行后,只需旋转矩阵并执行相同操作