Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Diagonalen überprüfen in 2-dimensionalem Array
DorJo - Do 28.02.08 14:47
Titel: Diagonalen überprüfen in 2-dimensionalem Array
Hy @ all,
ich bins mal wieder :oops:
Ich habe folgendes Problem: Ich habe einen zweidimensionalen Array [1..8,1..8]. Ein beliebiges Feld [x,y] des Arrays hat den Wert 3. Ich suche einen Algorithmus mit dem ich die schrägen um dieses Feld [x,y] überprüfen kann, aber mir fällt einfach nichts sinnvolles ein!
Allgemein muss man meiner Ansicht nach ja 3 verschiedene Fälle betrachten:
1) x=y ~~> Schräge von links nach rechts:
Delphi-Quelltext
1: 2: 3: 4:
| for i:=1 to 8 do begin array[i,i]-->überprüfen end; |
~~> aber wie kann ich zum Beispiel die schräge von rechts nach links überprüfen?
2) x>y (nach rechts verschoben) ~~> keine Ahnung :cry:
3) x<y (nach unten verschon) ~~> auch keine Ahnung :cry:
ich würde mich sehr über Vorschläge freuen
und danke schon mal im Voraus!
MfG
Dor JO
Gausi - Do 28.02.08 14:50
Meinst du sowas?
Delphi-Quelltext
1: 2: 3: 4:
| for i:=1 to 8 do begin array[8-i+1, i]-->überprüfen end; |
Kroko - Do 28.02.08 14:50
wenn es bei beliebigen (x;y) los geht, dann
Diagonale 1 ((x+i) mod 8;(y+i) mod 8 )
Diagonale 2 ((x-i) mod 8;(y+i) mod 8 )
DorJo - Do 28.02.08 14:54
WOW :shock:
Danke für die superschnellen Antworten
@Gausi: ja genausowas mein ich :wink:
@Kroko: das versteh ich nicht! Könntest du das bitte ein bisschen genauer erklären?! :oops:
Kroko - Do 28.02.08 15:04
Ja, die Diagonale1 geht nach rechts unten, Diagonale2 geht nach links unten, das Ganze in Schleife für I von 1 bis 8 und da hast die Koordinaten der 1. und 2. Diagonale, meine Schreibweise ist die Punktschreibweise aus der Mathematik Klasse 3 oder 4, :wink:
Horst_H - Do 28.02.08 15:12
Hallo,
das riecht nach dem n-Damen Problem siehe Nikolaus Wirth mit Überprüfung der Diagonalen oder div und mod und haste nicht gesehen...
aja, da war es doch:
http://www.delphi-forum.de/viewtopic.php?p=440863
Gruß Horst
Anschaulich:
Diagonale von links unten A1 x,y 1|1 nach rechts oben H8 x,y 8|8 wird zu
das HauptDiagonale [0] =HauptDiagonale [x-y] mit HauptDiagonale= array[-7..+7] of Boolean;
Diagonale von rechts unten A8 x,y 1|8 nach links oben H1 x,y 8|1 wird zu
das Nebendiagonale [9] =HauptDiagonale [x+y] mit NebenDiagonale= array[2..16] of Boolean;
DorJo - Do 28.02.08 18:12
Hmm
@Kroko: Das funktioniert leider nicht der Algorithmus :(
Ich hab aus deiner Beschreibung folgenden Code gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var i, x, y: integer; begin x:=strtoint(Edit1.Text); y:=strtoint(Edit2.Text); Memo1.Lines.Add('Diagonale nach rechts unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(((x+i) mod 8))+',' + inttostr(((y+i) mod 8))); end; Memo1.Lines.add('Diagonale nach links unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(((x-i) mod 8))+',' + inttostr(((y+i) mod 8))); end; |
und da kommt bei x=4 und y=2:
Diagonale nach rechts unten:
5,3
6,4
7,5
0,6
1,7
2,0
3,1
4,2
Diagonale nach links unten:
3,3
2,4
1,5
0,6
-1,7
-2,0
-3,1
-4,2
richtig wäre aber:
rechts unten:
3,1
5,3
6,4
7,5
8,6
Links unten:
1,5
2,4
3,3
5,1
~~> die 1,7 stimmt nicht und die 5,1 fehlt :(
weißt du woran das liegen könnte?
Kroko - Do 28.02.08 19:55
(1) ja, bei mir geht das Array von 0..7, bei dir von 1 bis 8, also
Delphi-Quelltext
1: 2:
| nx := 1+(x+i) mod 8; ny := 1+(y+i) mod 8; |
(2) die negativen Werte sind komisch, muss ich erst einmal selbst überprüfen
[edit]
(3) ein Abs einfügen
Delphi-Quelltext
1: 2:
| nx := 1+Abs((x-i) mod 8); ny := 1+(y+i) mod 8; |
DorJo - Do 28.02.08 20:46
@kroko: bei mir funzt das ni :cry:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var i, x, y: integer; begin Memo1.Clear; x:=strtoint(Edit1.Text); y:=strtoint(Edit2.Text); Memo1.Lines.Add('Diagonale nach rechts unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(1+Abs((x+i) mod 8))+',' + inttostr(1+(y+i) mod 8)); end; Memo1.Lines.add('Diagonale nach links unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(1+Abs((x-i) mod 8))+',' + inttostr(1+(y+i) mod 8)); end; |
BSP.: x=2 y=4
Diagonale nach rechts unten:
6,4 ja
7,5 ja
8,6 ja
1,7 nein
2,8 nein
3,1 ja
4,2 ja
5,3 ja
Diagonale nach links unten:
4,4 nein
3,5 nein
2,6 nein
1,7 nein
2,8 nein
3,1 ja (aber nach rechts unten schon)
4,2 ja
5,3 nein
~~>nach links unten müsste egtl. sein:
5,1
3,3
2,4
1,5
Kroko - Fr 29.02.08 07:39
ja, mein Fehler!
Geht es um das n-Damen -Problem?
DorJo - Fr 29.02.08 10:53
@Kroko: Also wenn ich dieses n-Damen Problem richtig verstanden hab handelt es sich darum... ich möchte im Prinzip die Zugmöglichkeiten eines Läufers im Schachspiel prüfen!
Kroko - Fr 29.02.08 11:37
Okay, dann teste Schrittweise (
for I := 0 to 7 do)
(1) rechts unten
Delphi-Quelltext
1: 2:
| nx := x+I; ny := y+I; |
(2) links unten
Delphi-Quelltext
1: 2:
| nx := x-I; ny := y+I; |
(3) rechts oben
Delphi-Quelltext
1: 2:
| nx := x+I; ny := y-I; |
(4) links oben
Delphi-Quelltext
1: 2:
| nx := x-I; ny := y-I; |
bis
Delphi-Quelltext
1: 2: 3:
| if (nx>0) and (ny>0) and (nx<8) and (ny<8) then else |
DorJo - Fr 29.02.08 11:47
@Kroko: Das versteh ich grad gar ni :oops: :cry: Was soll ich denn schrittweisse testen! Könntest du mir mal bitte erklären welcher grundgedanke dahinter steckt?! DANKE!!!
Kroko - Fr 29.02.08 12:37
(a) Was gibt es denn da nicht zu verstehen?
(B) Du hast eine Position X,Y und möchtest für den Läufer testen ob er wie weit laufen kann also
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var I,nx,ny: Integer; HFehler: Boolean; begin HFehler := False; for I := 0 to 7 do if not(HFehler) then begin nx := x+I; ny := y+I; if (nx>0) and (ny>0) and (nx<8) and (ny<8) then else HFehler := True; end; end; |
(c) Für die anderen Richtungen nx/ny anpassen (s.o.)!
DorJo - Fr 29.02.08 14:08
SUUUUPI!!! Jetz gehts!!! DANKE DANKE DANKE!!!
DANKE!
MfG Jo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!