这是我的2D数组。它的大小可以改变 在这种情况下,高度为24,宽度为40
........................................
........................................
..O.....................................
..OO....................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
........................................
..............................X.........
...............................XX.......
.............................XX.........
........................................
........................................
........................................
我需要有效地找到X和O的坐标。而不是一次一点一点地经过
typedef struct s_board
{
uint16_t w;
uint16_t h;
uint8_t p;
int fd;
int m_x;
int m_y;
int e_x;
int e_y;
char **fm;
char **sm;
} t_b;
void ft_position(t_b *b)
{
int16_t i;
int16_t j;
char c;
i = -1;
while (++i < b->h)
{ j = -1;
while(++j < b->w)
{
if(b->fm[i][j] == 'X')
{
b->m_x = j;
b->m_y = i;
}
}
}
i = -1;
while (++i < b->h)
{ j = -1;
while(++j < b->w)
{
if(b->fm[i][j] == 'O')
{
b->e_x = j;
b->e_y = i;
}
}
}
因为我的2D数组的大小可以更大并且是动态分配的。我的一位朋友告诉我要一次比较8个元素。我真的不知道该怎么做。
需要帮助才能搞清楚。
答案 0 :(得分:0)
您可以使用的最有效搜索是线性的,O(N)。但是,有一些方法可以改进您的代码。尝试仅在网格中循环一次,并在找到“X”和“O”后退出循环。以下代码执行此操作。
void ft_position(t_b *b)
{
uint16_t i;
uint16_t j;
b->m_x = -1;
b->m_y = -1;
b->e_x = -1;
b->e_y = -1;
for (i = 0; i < b->h; ++i) {
for (j = 0; j < b->w; ++j) {
if (b->fm[i][j] = 'X') {
b->m_x = j;
b->m_y = i;
if (b->e_x >= 0 && b->e_y >= 0)
break;
} else if (b->fm[i][j] = 'O') {
b->e_x = j;
b->e_y = i;
if (b->m_x >= 0 && b->m_y >= 0)
break;
}
}
if (b->m_x >= 0 && b->m_y >= 0 && b->e_x >= 0 && b->e_y >= 0)
break;
}
}
在一个周期内的64位CPU上,可以相互比较两个64位数字(8个字符中的位数)。这很可能是“一次比较8个元素”的含义。可以在一次操作中评估8 char
s的值。例如,与8 '.'
s(0x2E2E2E2E2E2E2E2E
)的值进行比较,指示当前8个字符集中是否存在“X”或“O”。这种方法有许多陷阱,但包括必要的填充等。