移动阵列的列

时间:2014-08-16 07:29:16

标签: c arrays

我希望将包含所有列的所有列移到右侧,并将其他所有列移到最左侧。以下是我想要实现的示例(左侧和右侧的结果:

NB。只有包含ALL的列才会向右移动。

12112111111211
12112111111211
11112112111211
11112111111211

结果:

22121111111111
22121111111111
12221111111111
12121111111111

到目前为止我的尝试: check = 1;

for (i = 1; i <= height; i++) {
    for (j = 1; j <= column; j++) {
        if (array[i][j] != '1'){
            check = 0;
            break;
        }
    }
}

if (check) {

    for (j = 1; j < width; j++)
        for (i = 1; i <= height; i++) {
            if (array[i][j] == '.') {
                array[i][j] = array[i][j+1];
                array[i][j+1] = '1';
           }
}

目前它只有左侧的两列,我理解为什么,但我不确定如何克服这个问题

2 个答案:

答案 0 :(得分:2)

您只需要将不是全1的列放在第一位。请尝试以下方法:

int colIndex = 0;
for(int c = 0 ; c < numOfCols ; c++)
{
    if(col c is not all 1)
    {
        swap column c with column colIndex;
        colIndex++;
    }
}

答案 1 :(得分:1)

您可以尝试以下算法:

for r = 0 to rows - 1
    c_first = 0
    for c = 0 to cols - 1
        if arr[r][c] == 2
            if c > c_first
                swap(arr[r][c] and arr[r][c_first])
                c_first++

编辑:

for c = cols - 1 to 0
    c_last = cols - 1
    if c has all rows = 1 AND c < c_last
        swap columns c and c_last
        c_last -= 1
    else if c has all rows = 1 AND c = c_last
        c_last -=1

这不是一个干净的算法,但应该可行。