It might be worth mentioning that if you look at the two dimensional array as a table and want to replace one of the rows you can point to the row then write the new values in. Same result but another way of thinking about it.
int row = 1; // index of row to replace
int *cellRow = cells[row]; // point to row
int newRow[] = {1, 1, 0, 0}; // new values
// write new values
for (c = 0; c < 4; c++) cellRow[c] = newRow[c];