【发布时间】:2021-12-18 23:18:42
【问题描述】:
我有一个充满元素的 N*N 矩阵。使用一个函数,我可以破坏一些元素,以便它们留下一个空白空间,可以被从上方落下的数字占据。流程示例:
[1][3][4][5] [1][ ][4][5] [ ][ ][ ][5]
[3][3][3][0]-->[ ][ ][ ][0]-->[ ][ ][4][0]
[3][0][2][1]-->[ ][0][2][1]-->[1][0][2][1]
[2][4][5][3] [2][4][5][3] [2][4][5][3]
在这个例子中,只有数字 1 和 4 掉了下来。同样,当一列完全为空时,左侧填充的那些必须向右移动。 我想创建一个函数 void Gravity (game_t * p)。
game_t 中定义:
typedef struct game{
int n; /*n*n matrix */
int h; /* numbers on matrix go from 0 to h-1*/
int ** board; /*the actual matrix*/
} game_t
我想不出解决这个问题的好策略,你能帮帮我吗?
编辑:这是我到目前为止写的:
void gravity(game_t *p) {
int i, j, k;
for (k = 0; k < p->n - 1; k++) {
for (i = p->n - 2; i = 0; i--) {
for (j = p->n - 1; i = 0; i--) {
if (p->board[i - 1][j] == EMPTY) {
p->board[i - 1][j] = p->board[i][j];
p->board[i][j] = EMPTY;
}
}
}
return;
}
我写的这个好像效率不高,应该是递归的吧。对于从右到左的第二行到最后一行的矩阵的每个元素,我检查下面的元素是否为空并将其移动到那里。但是,我必须多次检查矩阵 (k),因为某些元素可能必须移动不止一次。 `
【问题讨论】:
-
我知道你不会这样做,但请提供minimal reproducible example。然后,格式化您的代码,以便在每个
for、while、if之后使用复合语句(大括号)。一致地缩进你的代码。 -
一种下降数的算法是:对于每一列,从底部开始向上移动,标记第一个空槽,当找到第一个非空槽时停止;将其移至第一个空的。
-
我会尝试,但我对这个问题感到困惑。至少我可以尝试正确格式化。
-
丢弃标准是否只有 两个 相邻或 any 相邻匹配?也就是说,给定一个列:
1 2 3 3 3 4 5,您是否希望:1 2 _ _ 3 4 5-->_ _ 1 2 3 4 5作为第一步?还是您想要:1 2 _ _ _ 4 5-->_ _ _ 1 2 4 5作为第一步? -
别的。这 [最终] just 是 column 下降(即所有列都是独立的)吗?或者,这就像一个“选择 3”游戏,在 两个 维度上移除了一个 2D“岛”?
标签: c matrix multidimensional-array gravity