如何在C++中使矩阵中的圆运动?

edqdpe6u  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(119)

我有一个代码,其中数字1必须由行替换0,如下所示:


的数据
下面是它的代码:

int field[y][x] =
{
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0}
};
 
int main() 
{
    showField();                //Show field
    cout << endl;
    again:
    for (int i = 0; i < y; i++)
    {
        for (int j = 0; j < x; j++)
        {
            if (j > 0)
            {
                field[i][j - 1] = 0;
            }
            field[i][j] = 1;
            countTimeSec();         //updates the board per second
        }
        if (i == 2)
        {
            field[i][y - 1] = 0;
            goto again;
        }
        else 
        {
            field[i][y - 1] = 0;
        }
    }
    showField();
    return 0;
}
void countTimeSec() 
{
    int oneSec = 0;
    while (oneSec < 15)
    {
        showField(); 
        oneSec++; 
        system("cls");
    }
}

字符串
我想知道如何修改代码,使算法像这样:

如果会有任何逻辑如何使它,我也将赞赏,

yfwxisqw

yfwxisqw1#

首先,考虑如何旋转1D数组中的数字。当旋转图片中显示的矩阵时,基本上是旋转:

input:  [1, 0, 0, 0, 0, 0, 0, 0, 0]
output: [0, 1, 0, 0, 0, 0, 0, 0, 0]

字符串
对于单元素旋转,方法为:
1.设x为最后一个元素
1.将所有元素右移一位
1.将第一个元素设置为x
在2D中,你做的是完全相同的事情,除了你必须将2D位置Map到1D位置:

enum { x = 3, y = 3  };

int matrix[y][x] = {
    {1, 2, 3},
    {8, 0, 4},
    {7, 6, 5}
};

int* at_circumference(int i) {
    // {a, a, b}
    // {d, -, b}
    // {d, c, c}

    if (i < x - 1) return &matrix[0][    i]; // a
    i -= x - 1;
    if (i < y - 1) return &matrix[i][x - 1]; // b
    i -= y - 1;
    if (i < x - 1) return &matrix[y - 1][x - i - 1]; // c
    i -= x - 1;
    if (i < y - 1) return &matrix[y - i - 1][0]; // d
    
    exit(1); // index out of bounds
}


这样,旋转可以在1D中实现:

const int circumference = (y - 1 + x - 1) * 2;

void rotate(void) {
    int last = *at_circumference(circumference - 1);
    for (int i = circumference - 1; i > 0; --i) {
        *at_circumference(i) = *at_circumference(i - 1);
    }
    *at_circumference(0) = last;
}


最后是驱动程序代码:

void print_circumference(void) {
    for (int i = 0; i < circumference; ++i) {
        printf("%d ", *at_circumference(i));
    }
    puts("");
}

int main(void) {
    print_circumference();
    rotate();
    print_circumference();
}


程序输出(https://godbolt.org/z/Ghr5bqbGc):

进一步说明

如果可能的话,避免向后-goto。在原始代码中,其形式为:

again:
for (/* ... */) {
   // ...
   if (/* ... */) goto again;
}


.你本可以这样写:

while (1) {
    for (/* ... */) {
        if (/* ... */) goto again;
    }
    break;
    again: continue;
}


虽然这看起来可能更复杂,但while (1)循环可以立即清楚地表明重复正在进行,以及在什么范围内。
在这种情况下,您还可以通过创建一个

bool is_continue = false;


.变量,您可以在for循环期间更新该变量,并在周围的while循环中进行检查。

相关问题