gpt4 book ai didi

c++ - 对角排列数组

转载 作者:行者123 更新时间:2023-11-28 07:11:25 25 4
gpt4 key购买 nike

我已经查找了一些网站,但找不到我的问题的答案。

这是我的代码:

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <time.h>
#include<iomanip>
#include<array>
#include <algorithm>

using namespace std;
const int AS = 6;
int filling(void);
void printing(int[AS][AS]);
int forsorting(int[][AS], int);


int main()

{
int funny = 0;
int timpa = 0;
int counter = 0;
int Array[AS][AS];
srand(time(0));

for (int i = 0; i<AS; i++)
{
for (int j = 0; j<AS; j++)
Array[i][j] = filling();
}

cout << "The unsorted array is" << endl << endl;

printing(Array);


cout << "The sorted array is" << endl << endl;



for (int il = 0; il<AS; il++)
{
for (int elle = 0; elle<AS; elle++)
Array[il][elle] =forsorting(Array, funny);

printing(Array);

}

system("PAUSE");


return 0;

}

int filling(void)
{
int kira;
kira = rand() % 87 + 12;
return kira;
}


void printing(int Array[AS][AS])
{
int counter = 0;
for (int i = 0; i<AS; i++)
{
for (int j = 0; j<AS; j++)
{
cout << setw(5) << Array[i][j];
counter++;
if (counter%AS == 0)
cout << endl << endl;
}
}
}

int forsorting(int Array[AS][AS], int funny)
{
int c, tmp, x;
int dice = 0;
int Brray[AS*AS];
int timpa = 0;
int super = 0;


//Transofrming Array[][] into Brray[]
for (int i = 0; i < AS; i++)
{
for (int k = 0; k < AS; k++)
{
Brray[timpa] = Array[i][k];
timpa++;
}
}


//Bubble sorting in Brray[]

for (int passer = 1; passer <= AS-1; passer++)
{
for (int timon = 1; timon <= AS-1; timon++)
{
if (Brray[timpa]>Brray[timpa + 1])
{
super = Brray[timpa];
Brray[timpa] = Brray[timpa + 1];
Brray[timpa + 1] = super;
}
}
}

//Transforming Brray[] into Array[][]

for (int e = 0; e<AS; e++)
{
for (int d = 0; d<AS; d++)
{
Brray[dice] = Array[e][d];

dice++;
}
}

***There's a part missing here***


}

我要做的是,使用 3 个函数编写一个程序。

  • 第一个函数会随机填充我的二维数组(这部分没问题)
  • 第二个函数会在屏幕上打印未排序的数组(这部分没问题)
  • 第三个函数将按对角线对我的数组进行排序,如下图所示:

Sample

然后我需要调用第二个函数来打印排序后的数组。我的问题是第三个函数,我将二维数组转换为一维数组并使用冒泡排序对其进行排序,但我不能做的是将其转换回对角线排序的二维数组。

最佳答案

如果您可以将二维数组转换为一维数组,那么转换回来就是相反的过程。采取相同的循环并围绕分配进行更改。

但是在您的情况下,转换本身是错误的。它应按 (0;0)、(0;1)、(1;0) 的顺序采用索引。但它所做的是按 (0;0)、(0;1)、(1;1) 的顺序获取索引。

我的建议是利用每条对角线上的 X 坐标和 Y 坐标之和相同并且从 0 到 AS*2-2 的事实。

然后使用另一个循环,您可以检查所有可能的有效 x/y 组合。像这样:

for ( int sum = 0; sum < AS*2-1; sum++ )
{
for ( int y = sum >= AS ? sum-AS+1 : 0; y < AS; y++ )
{
x = sum - y;
// Here assign either from Array to Brray or from Brray to Array
}
}

附言如果你想变得非常聪明,我很确定你可以制作一个数学(非迭代)函数,将 Brray 中的索引转换为 Array 中的索引对,反之亦然。然后您可以就地应用冒泡排序。但这比我现在愿意弄清楚的要棘手一些。不过,您可能会因此获得额外的奖励。

附言第二天早上实现:你可以使用这种方法直接在二维数组中实现冒泡排序。无需复制。可以这样想:如果你知道一对 (x;y) 坐标,你可以很容易地找出列表中的下一个 (x;y) 坐标。所以你可以从任何一点向前移动数组。无论如何,这就是冒泡排序所需要的。

关于c++ - 对角排列数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com