Jak to napisać prościej

0

Chodzi o to że mam tablice [5][5] z literami i użytlkownik, może podać klucz, czyli, po kolei do każdej komórki może przypisać dowolną literę alfabetu, może podać tych liczb 5, a może całą tablicę, problemem jest to że jeśli poda, np tylko 2 litery, to resztę tablicy należy uzupełnić brakującymi literami, jesli użytkwonik podał A i Z to tablicę należy uzupełnić od B do Y, nie mogą się powtarzać te same litery,
wiem jak to zrobić, ale jak by można to było zrobić lepiej, jakoś ładniej
tutaj jest kod, bez sprawdzania, właściwie czegokolwiek, dziękuje za wszytkie pomysły
aha, to nie jest ten mój sposób, tylko bez sprawdzania, no

	char array[5][5]={
	{'A','B','C','D','E'},
	{'F','G','H','I','K'},
	{'L','M','N','O','P'},
	{'Q','R','S','T','U'},
	{'V','W','X','Y','Z'}
	};
	char character;
	int x, y;
	char temp;
	std::string input;
	int stringIndex = 0;
	std::cin >> input;
	
	for(int i = 0; i < 5; ++i)
		for(int j = 0; j < 5 && stringIndex < input.length(); ++j)
		{
			array[i][j] = input[stringIndex];
			++stringIndex;
		}
0

Ale serio, masz problem z czymś tak banalnym?

Przykładowo:

  1. Tworzysz zbór z literami alfabetu. Reprezentacja dowolna, możesz użyć tablicy 25 booli, set, unordered_set, et cetera.
  2. Jeśli użytkownik podał literę dla danej komórki, to usuwasz tą literę ze zbioru.
    • Opcjonalnie powinieneś zweryfikować czy litera nie została już podona, jeżeli litery nie mogą się powtarzać. Weryfikujesz przez sprawdzenie czy litera jest dalej w zbiorze.
  3. Jeśli użytkownik zakończył podawać litery, to brakujące komórki uzupełniasz po kolei literami ze zbioru. Następnie czyścisz zbiór.

Można zrobić także na odwrót, zamiast zbioru pozostałych liter trzymać zbiór liter już wykorzystanych.

0

no nie? chyba nie rozumiesz,
Dla każdej komórki musze przeszukiwać cala tablicę aby sprawdzić czy nie została już taka litera podana, pytam się czy nie można tego zrobić jakoś sprytniej

0

petla + Dictionary (std::map)

0

Mam dobry dzień, więc wyjaśnię.

bartek164 napisał(a):

a ja wiem? co to znaczy zbiór, bo.. ale i tak trzeba przeszukiwać cała tablicę ten twój zbiór, więc to to samo, co przeszukiwać całą tablicę dwuwymiarowaą

Zbiór to pojęcie z matematyki. Załóżmy, że zbiór trzyma pojedynczy egzemplarz wartości. Poza tym można łatwo sprawdzić czy dana wartość jest już w zbiorze.
W c++ można użyć std::set (albo std::unordered_set).

Sam napisałeś, że każda litera może być wykorzystana raz. Po wykorzystaniu litery wkładasz ją do zbioru. Następnym razem przy sprawdzeniu, czy jakaś litera może być użyta sprawdzasz czy jest już w zbiorze. Jeżeli jest w zbiorze, to nie można jej użyć.

Czas potrzebny na sprawdzenie czy element jest w zbiorze zależy od jego implementacji. Dla std::set jest to proporcjonalne do logarytmu z ilości elementów w zbiorze. Dla std::unordered_set -po zamortyzowaniu, pomijając możliwość kolizji - będzie proporcjonalne do wartości stałej.

Dla tak trywialnie małych danych nie ma to znaczenia, ale rozwiązanie zyskuje na elegancji.

bartek164 napisał(a):

możesz wytlumazyc jak to ma sie do tego->tablica 25 bool - Jeśli użytkownik podał literę dla danej komórki, to usuwasz tą literę ze zbioru.

Usuwanie to operacja "abstrakcyjna". Nie traktuj tego dosłownie.
Zakładając kodowanie asci dużych liter alfabetu angielskiego, to masz 25 możliwe litery ('od A' do 'Z'). Możesz więc użyć tablicy - bool literyWykorzystane['Z' - 'A' + 1] do odnotowania sobie, które litery zostały wykorzystane. Jeżeli literyWykorzystane[sprawdzanaLitera - 'A'] == true , to znasz, że wykorzystałeś sprawdzaną literę. Czy to zrozumiałe?

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