Witam,
mam taki problem: chcę napisać program, który by mi tworzył dwuwymiarową tablicę n*n i uzupełniał ją po kolei "po spirali", tzn. dla n = 4 ma być takie coś:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
Wiem oczywiście, że można to zrobić na miliard sposobów, ale ja chcę to akurat (w ramach ćwiczenia języka) zrobić rekurencyjnie, poprzez manipulację wskaźnikami.
Naskrobałem takie cuś:
#include <iostream>
using namespace std;
void
fill_matrix(int _index, int _max, int _size, int** _matrix) {
int i = 0, j = 0;
if (_index + 1 == _max) {
_matrix[0][0] = _index + 1;
return;
}
for (; i < _size - 1; i++)
_matrix[0][i] = ++_index;
for (; j < _size - 1; j++)
_matrix[j][i] = ++_index;
for (; i > 0; i--)
_matrix[j][i] = ++_index;
for (; j > 0; j--)
_matrix[j][0] = ++_index;
if (_index < _max)
fill_matrix(_index, _max, _size - 2, &(&_matrix[1])[1]);
}
int **
create_matrix(int _n) {
int** tablica = new int*[_n];
for (int i = 0; i < _n; i++)
tablica[i] = new int[_n];
fill_matrix(0, _n * _n, _n, tablica);
return tablica;
}
void
remove_matrix(int** _matrix, int _n) {
for (int i = 0; i < _n; i++)
delete[] _matrix[i];
delete[] _matrix;
}
int
main() {
const int n = 4;
int** tablica = create_matrix(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << (tablica[i][j] < 10 ? " " : "") << tablica[i][j] << " ";
cout << endl;
}
remove_matrix(tablica, n);
return 0;
}
Widzicie mój zamysł - każde kolejne wywołanie rekurencji ma dostawać tablicę o jeden rząd i jeden wiersz mniejszą. Tyle, że zamiast tego dostaję tablicę mniejszą o dwa wiersze i zero rzędów. W skrócie, dostaję takie coś:
1 2 3 4
12 0 0 5
13 14 0 6
16 15 8 7
Jak temu zaradzić? Jak dostać wskaźnik int** na pozycję [1][1]?
Z góry dziękuję za odpowiedź i pozdrawiam.