Zmiana postaci Macierzy na listę jej przekątnych

0

Piszę program i utknąłem w jednym punkcie otóż mam macierz dwuwymiarową int** A. Wypełniam ją jakimiś danymi i następnie chciałbym zmienić postać tej macierzy na listę przekątnych (wektorów) poniżej dam przykład. Jak taki efekt osiągnąć, jak powinna wygladać funkcja oraz jak zrobić funkcję odwrotną to znaczy ze z wygerenowanych list przekąnych z powrotem zbuduje macierz.

Przykład:

Mamy macierz
A= { 1 2 3
4 5 6
7 8 9 };

i teraz chcialbym zeby funkcja brala za argument ta macierz i wyrzucala taka liste wektorow (przekatnych macierzy)

przekatna[1] = 1;
przekatna[2] = 4, 2;
przekatna[3] = 7,5,3;
przekatna[4] = 8,6;
przekatna[5] = 9;

Jak takie cos osiagnac?

0

chociażby tak:

	int A[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
	int i, j, k;

	vector <vector <int> > l;

	vector <int> tmp;
	for(i = 0; i < 3; i++) {
		for(j = i, k = 0; j >= 0 && k < 3; j--, k++)
			tmp.push_back(A[j][k]);
		l.push_back(tmp);
		tmp.clear();
	}

	for(i = 1; i < 3; i++) {
		for(j = 2, k = i; j >= 0 && k < 3; j--, k++)
			tmp.push_back(A[j][k]);
		l.push_back(tmp);
		tmp.clear();
	}

	vector <int>::iterator it;
	for(i = 0; i < l.size(); i++) {
		for(it = l[i].begin(); it != l[i].end(); it++)
			printf("%d ", (*it));
		printf("\n");
	}
0

Rzeczywiscie twoj sposob elegancko działa, a czy ktos wie jak to zrobic w C bez uzywania klasy vector?

0

Oraz jak zbudowac funkcje odwrotna, to znaczy taka ktora wezmie liste przekatnych i zmieni ja na macierz.

0

Ok dobra z funkcja odwrotna juz sobie poradzilem

0

Poniższy pseudokod pokazuje jak to zrobić (inna metoda, niż ta podana wcześniej)

for (int i = 0; i < N; ++i) {
  for (int j = 0; j < N; ++j) {
      przekatna[i+j+1].add(A[i][j]);
  }
}

Na wyjściu masz wektor 'przekatna', taki że przekatna[i] to lista elementów z odpowiedniej przekątnej. Kod wykorzystuje fakt, że numer przekątnej, do której należy dany element (A[i][j]) to suma współrzędnych+1 (i+j+1).

Funkcja odwrotna jest IMO oczywista i równie prosta co ten pseudokod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1