What have you tried? How did it work or not work?
Generally speaking, it is not possible to remove rows or columns from a true 2D array. By true 2D array, I mean something like;
Code:
/* assume m and n hold valid values */
int array[m][n];
You will need to move data between elements of the array (for example, move data you would put into columns 6 and 7 into columns 2 and 4 respectively). That effectively reuses rows/columns rather than removing and replacing them. Of course, you need to do bookkeeping to keep track of data (so, after moving data between array elements, you know what the result means).
However, if you really need to remove rows or columns from an array (in the sense of explicitly allocating and deallocating them) use pointers and dynamic memory allocation/deallocation. Pointers behave in some ways that you would expect of an array, while permitting some behaviours, such as those you describe. Similarly, pointers to pointers can be used to emulate something that behaves (somewhat) like a 2D array, but allow things to be done dynamically.
Either approach is possible, depending on how determined you are to do things dynamically. Both have trade-offs (copying data between array elements has an expense, as does dynamic memory allocation/deallocation) so it is not always obvious (without a fair amount of thought, or measuring performance) to predict which is "better" for any measure you might pick to mean "better".