有效地在网格中找到2个非空单元格的坐标

时间:2018-04-14 01:07:09

标签: c

这是我的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个元素。我真的不知道该怎么做。

需要帮助才能搞清楚。

1 个答案:

答案 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”。这种方法有许多陷阱,但包括必要的填充等。