Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Java: Matrix





Frage

Hi, habe eine Frage zu einem z.Bsp. char [4] [5] array. Mit random fülle ich ein paar Elemente der Matrix mit einem Char (z.B. 'Z'). Jetzt will ich alle Elemente suchen, die ein 'Z' haben, und die von keinem anderen Element mit 'Z' tangiert werden. Wie kann ich dies lösen?? Danke und Gruß, C.

Antwort 1 von semi

Meinst Du sowas?

a Z Z b Z
a Z b Z c
Z a b Z Z
a Z Z Z b 



Antwort 2 von cheetah_83

ich hab jetzt von java speziell nicht so die ahnung, hab allerdings mal vor ein paar jahren informatik gehabt (qbasic) und würde es vom ansatz wie folgt lösen:

du richtest eine doppelte schleife ein in der du zwei indezes hochlaufen lässt (z.b. i von 1-4 und j von 1-5) damit kannst du nachheinander alle felder der matrix abfragen. soltle ein Z drin sein (if anweisung) kannst du über i + - 1 und j + - 1 die drumherumliegenden felder abfragen.

ich hoffe du verstehst was ich meine

Antwort 3 von TheRealWhistler

Hi,

also der Suchaufwand für eine Matrix mit einer Abmessung von n * m ist O(n * m + C), wobei C eine Konstante ist.

das würde ich z.B. wie folgt lösen:

=============================================
----------------------
gegeben:
int max_n = 4, max_m = 5;
char suchzeichen = 'Z';
char matrix[max_n][max_m];
----------------------


int n, m;
boolean wird_nicht_tangiert;
boolean search_oberhalb, search_unterhalb;
boolean search_links, search_rechts;
boolean search_links_oben, search_rechts_oben;
boolean search_links_unten, search_rechts_unten;

-for( n = 0; n < max_n; n++)
-{
---for( m = 0; m < max_m; m++)
---{
------if( matrix[n][m] != suchzeichen) continue;

------wird_nicht_tangiert = true;

------search_oberhalb = true;
------search_unterhalb = true;
------search_links = true;
------search_rechts = true;
------search_links_oben = true;
------search_rechts_oben = true;
------search_links_unten = true;
------search_rechts_unten = true;

------if( n == 0) // 1. Zeile
------{
---------search_oberhalb = false;
---------search_links_oben = false;
---------search_rechts_oben = false;
------}

------if( m == 0) // 1. Spalte
------{
---------search_links = false;
---------search_links_oben = false;
---------search_links_unten = false;
------}

------if( n == max_n-1) // letzte Zeile
------{
---------search_unterhalb = false;
---------search_links_unten = false;
---------search_rechts_unten = false;
------}

------if( m == max_m-1) // letzte Spalte
------{
---------search_rechts = false;
---------search_rechts_oben = false;
---------search_rechts_unten = false;
------}

------while( true) // hilfsschleife für bedingten
------{ // Abbruch der Suche

---------if( search_oberhalb == true)
---------{
------------if( matrix[n-1][m] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

---------if( search_unterhalb == true)
---------{
------------if( matrix[n+1][m] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

---------if( search_links == true)
---------{
------------if( matrix[n][m-1] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

---------if( search_rechts == true)
---------{
------------if( matrix[n][m+1] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

---------if( search_links_oben == true)
---------{
------------if( matrix[n-1][m-1] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

---------if( search_links_unten == true)
---------{
------------if( matrix[n+1][m-1] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

---------if( search_rechts_oben == true)
---------{
------------if( matrix[n-1][m+1] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

---------if( search_rechts_unten == true)
---------{
------------if( matrix[n+1][m+1] == suchzeichen)
------------{
---------------wird_nicht_tangiert = false;
---------------break;
------------}
---------}

------} // while( true) - Schleife

---if( wird_nicht_tangiert == true)
---{
------// !!!!!!!!!!!!!!!!!!!!!!!!!!!
------// Hier Quellcode einfügen
------// was geschehen soll, wenn
------// das "suchzeichen", an der
------// Position [n][m] in dem
------// Array "matrix" nicht von dem gleichen
------// "suchzeichnen" tangiert wird.
------// !!!!!!!!!!!!!!!!!!!!!!!!!!!
---}

---} // for ( m ... - Schleife
-} // for ( n ... - Schleife

=================================================

Die führenden "-" - Zeichen einfach mit Leerzeichen oder Tabulatoren, ersetzen.

Ich mußte nur irgend ein Füllzeichen davorschreiben, damit die führenden Leerzeichen jeder Programmzeile nicht nach dem Posten gelöscht werden. Mit eingerückten Programmzeilen sieht der Code übersichtlicher aus.

PS: Schaut mal bei codinghelp.de vorbei.

Ciao

Andreas

Antwort 4 von Claudia

@ RealWhistler,
Hi!
Super, das funktioniert ja einwandfrei!! Gute Idee hier mit Booleschen Variablen zu arbeiten. Das einzige, was ich bei Deiner Variante geändert habe, ist die Hilfsschleife while(true). Nur wenn ich sie weglasse, klappt es, und endet nicht in einer Endlosschleife.

Herzlichen DANK nochmals,
Ciao,
C.



Antwort 5 von Claudia

@Semi
Hi!
Danke auch Dir. Ja, so etwas meine ich:
(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)
Nun sind z.Bsp. (1,1), (2,3), (1,4) mit einem 'Z' gefüllt. Ein Programm ist zu entwickeln, das alle Arrayelemente ausgibt, die ein 'X' haben, und weder recht, links, diagonal von sich ein 'X' haben. Im Bsp. ist das nur das Element 1,1.

Ciao,
C.

@ Cheetah 83
Hi!
Ja, danke, das ist ein guter Anfang. Es gibt allerdings ein spezielles Problem, wenn Du nicht die Randbereiche beachtest. Ist bspw. die Zeile 0 dran und Du willst sie auf Zeile-1 prüfen, dann bekommst Du einen ArrayIndexOutBoundsException. Genauso wenn die for -Schleife bei der letzten Zeile angekommen ist, dann kannst Du nicht auf Zeile+1 prüfen. Ausserdem sollen auch die Feldelemente diagonal links/rechts, oben /unten geprüft werden. S. Lösung bei RealWhistler.

Ciao,
C.

Antwort 6 von Claudia

@Semi nochmals,

hatte bei meiner Antwort einen Fehler: statt 'X' meinte ich durchgängig 'Z'.
:)
C.

Antwort 7 von TheRealWhistler

@ Claudia,

Ja stimmt, du solltest die while(true) schleife wieder rein nehemen (aus Persormance gründen), denn die Überspringt die anderen If anweisungen mit break, wenn ein 'Z' gefunden wurde.

Das ist nur eine Endlosschleife, weil ich leider das "break;" am Ende der Schleife vergessen hatte. (Schusselfehler von mir)

also:

...
----------break; // das Break einfügen!!!
------} // while( true) - Schleife
...

Ciao

Antwort 8 von GrapeFruit

@ TheRealWhistler

Hi,

ja, exakt. Danke für den Hinweis! Klappt nun eins a!!

Ciao,
C. [alias GrapeFruit]

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: