我有一个基本的Backtracking算法,它可以检查是否可以在地图上放置俄罗斯方块,所有功能都很简单,check_map可以检查地图上是否有地方,place_map可以在俄罗斯地图上放置俄罗斯方块,而delete_tetri可以删除俄罗斯方块在地图上。
按照惯例,我希望函数最多保留25行,因此我需要将此代码 split 或 refactor 分解成多个较小的函数。>
我很难做到这一点,因为很难跟踪所有变量。
int fillit(char *map, char **tab, int map_size, int j)
{
int map_index;
int nb_block;
int **tetri;
int *hash_index;
tetri = tetri_stock_hash(tab, j, map_size);
map_index = 0;
nb_block = 0;
if (!(hash_index = (int *)ft_memalloc(sizeof(hash_index) * (j + 1))))
return (-1);
while (nb_block != j)
{
if (check_in_map(tetri, map, nb_block, map_index) == 1)
{
hash_index[nb_block] = map_index;
place_in_map(tetri, map, &nb_block, &map_index);
}
else if (check_in_map(tetri, map, nb_block, map_index) == -1)
map_index++;
else if (check_in_map(tetri, map, nb_block, map_index) == 2)
{
if (nb_block == 0)
{
map_size++;
map = map_generate(4 + map_size);
fillit(map, tab, map_size, j);
return (1);
}
nb_block--;
delete_in_map(tetri, map, nb_block, hash_index[nb_block]);
map_index = hash_index[nb_block] + 1;
}
}
a_z(tetri, map, hash_index, j);
map_print_color(map);
return (0);
}
答案 0 :(得分:0)
如果您的目的只是减少行数,那么您可以尝试以下方法:
int fillit(char *map, char **tab, int map_size, int j) {
int map_index = 0, nb_block = 0, **tetri, *hash_index;
tetri = tetri_stock_hash(tab, j, map_size);
if (!(hash_index = (int *)ft_memalloc(sizeof(hash_index) * (j + 1))))
return (-1);
while (nb_block != j) {
switch (check_in_map(tetri, map, nb_block, map_index)) {
case 1: hash_index[nb_block] = map_index;
place_in_map(tetri, map, &nb_block, &map_index); break;
case -1: map_index++; break;
case 2: if (nb_block == 0) {
map_size++;
map = map_generate(4 + map_size);
fillit(map, tab, map_size, j);
return (1);
}
nb_block--;
delete_in_map(tetri, map, nb_block, hash_index[nb_block]);
map_index = hash_index[nb_block] + 1; break;
}
}
a_z(tetri, map, hash_index, j);
map_print_color(map);
return (0);
}
这正是您编写的内容,我不了解其背后的算法或逻辑,只是删除了多余的行,并在此处和此处进行了一些修补。