Szukanie duplikatów po przekątnej w macierzy dwuwymiarowej

0

Witam serdecznie. Od niedawna zaczynam przygodę z programowaniem. Mam problem z następującym zadaniem:

Zadeklaruj dwuwymiarowa tablice zmiennych typu int o rozmiarach 5 na 5 elementów.
Nastepnie wypełnij jej pola losowymi wartosciami i sprawdz czy na którejkolwiek
z przekatnych tej tablicy sa przynajmniej dwie takie same wartosci.

Prosiłbym o rozwiązanie zadania lub ewentualnie o podpowiedz w jego rozwiązaniu. Będę wdzięczny! :)

0

A co ci się udało już zrobić?

Do generowania liczb możesz wykorzystać klasę java.util.Random.

Natomiast do sprawdzenia przekątnych możesz np. dodać wszystkie liczby do Seta i sprawdzić czy jego długość jest równa 5, jak nie to są duplikaty.

0

Z grubsza to jakoś tak:

      int size = 5;
      int[][] array = new int[size][size];
      Random randomGenerator = new Random();

      for (int[] row: array) {
         for (int elem: row) {
              elem = randomGenerator.nextInt(100);
         }
      }

Drugą (ciekawszą) część zadania jednak zostawiam Ci do rozważenia ;)

0

Jako że też się uczę, w moim wypadku C++, to potraktowałem to jako ćwiczenie. Jest to tylko jedna z części zadania - sprawdza przekątne tylko w osi X, od lewej do prawej, można też poprawić wyświetlanie wyników. Ponadto została implementacja pozostałych 3 przekątnych, ale myślę, że nie będzie problemu. Oczywiście na pewno można to zrobić o wiele bardziej efektywnie. Mam nadzieję, że poradzisz sobie z przerobieniem kodu na jave, nie testowałem też tego jakoś super dokładnie, ale **wydaje **mi się, że jest ok.

#include <iostream>
#include <ctime>
#include <cstdlib>

	const int X_SIZE = 6;		//wiersz
	const int Y_SIZE = 6;		//kolumna

int main()
{
	
		srand( time( NULL ) );
	
		
		int f[X_SIZE][Y_SIZE];
		
		for (int i = 0; i<X_SIZE; i++)
		{
			for(int j = 0; j<Y_SIZE; j++)
			{
			f[i][j] = (rand() % 8 ) +1;
			}
		}
		
		for (int i = 0; i<X_SIZE; i++)
		{
			for(int j = 0; j<Y_SIZE; j++)
			{
				std::cout<<f[i][j]<<" ";
			}
			std::cout<<std::endl;
		}
		std::cout<<std::endl;
	
  	 	int przekatna_x = X_SIZE - 1;   //uciete wierzcholki
  		int przekatna_y = Y_SIZE - 1;
		
		int tab_y[X_SIZE];
	
	    if (Y_SIZE >= X_SIZE)
	    {		
		        for(int z = 0; z < (Y_SIZE - przekatna_x); z++)    //sprawdzanie az do ost. wiersza
				{				   				
					for(int j = 0; j < X_SIZE; j++)
					{
								
				     	tab_y[j] = f[j][z+j];    				
						int pom = f[j][z+j];
													
						for(int c = 0; c < j; c++)
						{
							if(pom == tab_y[c]) 
							{
							std::cout<<"POWTORKA! Przekatna:"
							<<z<<" Liczba : "<<pom<<std::endl;
							}
						}
									
					}
				}
		    				
				for(int z = Y_SIZE - przekatna_x, s = 0; z < przekatna_y; z++,s++)
				{							
					for(int j = 0; j < przekatna_x-s ; j++)
					{
						tab_y[j] = f[j][z+j];    				
						int pom = f[j][z+j];
															
						for(int c = 0; c < j; c++)
						{
							if(pom == tab_y[c]) 
							{
					   		std::cout<<"POWTORKA! Przekatna:"
							<<z<<" Liczba : "<<pom<<std::endl;
							}
						}			
			       	}						
				}	
					
		}
			
	return 0;
}

 
0

@kacyk
Przecież kwadrat ma dwie przekątne, a macierz o wymiarch NxN na dodatek można załatwić za pomocą jednej zmiennej krokowej:

//przekatna lewy_górny-prawy_dolny
for(int i = 0; i < SIZE; ++i)
{
    tab[i][i] //bla bla operacje
}

//przekatna lewy_dolny-prawy_górny
for(int i = 0; i < SIZE; ++i)
{
    tab[i][SIZE-i] //bla bla operacje
}
0

Ok, skomplikowałem sobie zadnie. Tak to jest jak się nie czyta dokładnie... Sprawdzam liczby po skosie.

Coś mnie dopadła mroczność umysłu, że zapomniałem co to przekątna...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.