2015-12-09 4 views
0

У меня 2D-массив как сетка, которую можно считать игровой панелью. Когда плата инициализируется, так что игра запущена, есть четыре человека. Он работает для сетки nxn. В качестве примерапреобразование из массива 2d в 1d

x o 
o x 

Я использую 2D-массив. Теперь я пытаюсь преобразовать массив в 1D. Я зациклился на том, как я могу помещать символы в сетку для массива 1D.

for(int i = 0; i < row; ++i) 
    for(int j = 0; j < col; ++j) 
    { 
     //grid[i][j] = '.'; 
     grid[i * col + j] = '.'; // I've converted the part 
    } 

    int centerh = row/2; 
    int centerw = col/2; 

    // I'm stuck that part. 

    grid[centerh][centerw] = 'o'; 
    grid[centerh - 1][centerw - 1] = 'o'; 

    grid[centerh][centerw - 1] = 'x'; 
    grid[centerh - 1][centerw] = 'x'; 
+0

Преобразование такое же, как вы уже сделали в цикле for: 'grid [centerh * col + centerw] = 'o';' – kaylum

+0

Компетентный программист на C++ написал бы функцию доступа, чтобы разрешить доступ 2d к 1d массив. Но внутри или вместо этой функции шаблон, который вы уже использовали в одном месте, должен работать повсюду. Думаю, вы скопировали это первое изменение от кого-то, не понимая этого. Может быть, еще один пример поможет: Измените '[centerh - 1] [centerw - 1]' to '[(centerh - 1) * col + centerw - 1]' – JSF

+0

thank @JSF другая вещь есть какая-то разница между 'grid [ i * col + j] 'и' grid [i * row + j] ', когда массив 2d преобразуется в 1d? – askque

ответ

1

Это преобразует 2D сетки в 1D:

grid1D[row*col]; 
grid2D[row][col]; 

for(int i = 0; i < row; ++i) 
    for(int j = 0; j < col; ++j) 
      grid1D[i * col + j] = grid2D[i][j]; 
1

В C Я хотел бы использовать макросы и 1D-массива сек основу для такого рода вещи.

Что-то вроде:

#define WIDTH 10 
#define HEIGHT 10 

char grid[ WIDTH * HEIGHT ] ; 

#define ELEMENT(row,column) grid[ ((row)*WIDTH) + (column) ] 

/* Read an element */ 

char c ; 

c = ELEMENT(5, 7) ; 

/* write to an element */ 

ELEMENT(5, 7) = 'x' ; 

/* access the array in 1D is trivial as you simply use grid[] directly */ 

Таким образом, вы можете использовать один и тот же 1D массив в качестве 2D-элемента без дублирования.

Один важный момент: избегайте операций после и после декремента при использовании макросов. Причина этого в том, что они могут привести к запутывающим ошибкам, поскольку макросы не являются функциями, и каждый «параметр» макроса представляет собой просто текст, который заменяет соответствующий макрос «параметр».

Смежные вопросы