3

我在 C 中处理的一个简短的任务有点麻烦。我有一个二维数组,如下所示:

0 5 5 5
0 0 5 5
0 0 0 5
0 0 0 0

我想在对角线上反映 5,所以它看起来像这样:

0 0 0 0
5 0 0 0
5 5 0 0
5 5 5 0

这就是我所拥有的:

//reflect the 5's
for(i = 0; i < arraySize; i++) {
    for (j = 0; j < arraySize; j++) {
        int temp = array[i][j];
        array[i][j] = array[j][i];
        array[j][i] = temp;
    }
}

它没有反映 5,当我在发生这种情况后打印出数组时,它看起来与我的初始化数组相同。我觉得这是我应该做的,但我做错了吗?感谢帮助。

4

4 回答 4

2

交换值时,您必须在循环中途停止,否则您会将它们交换回您开始的位置!

于 2013-04-24T01:53:32.440 回答
2

正如我在评论中提到的那样,由于您正在迭代整个矩阵,因此您确实在反射,但是当您低于对角线时,您会将5s 反射回其原始位置。内部循环应该从开始,i+1这将使您保持在对角线之上:

for (j = i+1; j < arraySize; j++) {
         ^^^
于 2013-04-24T01:55:10.420 回答
1

正如评论者指出的那样,当您在对角线下方进行迭代时,您正在反思,撤消您刚刚进行的交换。

你的阵列总是方形的吗?如果是这样,这应该适合你:

for(i = 0; i < arraySize; i++) {
    for (j = i+1; j < arraySize; j++) {

这很有效,因为i它还告诉我们应该沿对角线开始多远。我们添加+1,因为我们不需要交换对角线的中间值。

于 2013-04-24T01:54:27.447 回答
0

一般:swap(a[i][j], a[j][i]) for j=i+1..arrSize

//reflect the 5's
for(i = 0; i < arraySize; i++) {
    for (j = i+1; j < arraySize; j++) {
        int temp = array[i][j];
        array[i][j] = array[j][i];
        array[j][i] = temp;
    }
}
于 2013-04-24T01:53:47.713 回答